学习日记0827异常处理 元类 自定义元类 自定义元类来实例化类 属性查找顺序

Posted jianhaozhou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习日记0827异常处理 元类 自定义元类 自定义元类来实例化类 属性查找顺序相关的知识,希望对你有一定的参考价值。

异常处理

  什么是异常处理:

    异常是程序运行过程中发生错误的信号,一旦程序中出现异常,并且没有被处理,那么这个异常就会被抛出,并且程序会因此终止

    异常包含三个部分:

      1 traceback异常的追踪信息

      2 异常的类型

      3 异常的信息

    错误分为两大类:

      1 语法上的错误

      2 逻辑上的错误

  怎么处理异常:

    

try:
    #要处理的可能含有异常的语句
Except 异常类型 as 变量名(里面存放的是要抛出的异常的信息):
    #抛出异常是处理的代码

  万能异常类型:

    Exception

  try.....Except.....else当没有异常时会执行的语句(需要放在Except的后面)....finally最后执行的语句(一般存放回收系统资源的语句)....

元类

  什么是元类:

    在python中一切皆对象,那么有一些没有被实例化过的对象是怎么来的呢,它们都是由元类type实例化得到的

  如:

class OldboyTeacher:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def score(self):
        print(%s is scoring %self.name)

tea1=OldboyTeacher(egon,18,male)#对象tea1是OldboyTeacher实例化得来的,那么对象OldboyTeacher是元类type实例化得来的
# print(type(tea1))
print(type(OldboyTeacher))

  class的底层原理:

    1 得到类名

    2 得到类的基类

    3 拿到类的名称空间

    4 调用元类type实例化类

  

class_name = OldBoy
class_base = (object,)
class_dic = {}
class_body="""
school = ‘Oldboy‘

def __init__(self,name,age,sex):
    self.name=name
    self.age=age
    self.sex=sex

def score(self):
    print(‘%s is scoring‘ %self.name)
"""
exec(class_body,{},class_dic)
OldBoy = type(class_name,class_base,class_dic)

 

自定义一个元类来控制类的产生:

    (关键点:__init__是在实例化对象是自动调用方法,而OldboyTeacher实质就是Mymate这个元类实例化产生的类(也可以说是对象),应为在OldboyTeacher()的()中会传入4个值依次是1类的类型

2 类名 3 父类 4 名称空间,所以在重新__init__方法时也要有4个值)

class Mymate(type):#凡是继承了type的类都叫元类
    def __init__(self,class_name,class_base,class_dic):
           if not class_name.lower():
                raise typeError(类型必须是驼峰体)

    doc=class_dic.get(__doc__)
        if doc is None or len(doc) == 0 or len(doc.strip(
 )) == 0:
            raise TypeError(类体中必须有文档注释,且文档注释不能为空)

class OldboyTeacher(object,metaclass=Mymeta): #OldboyTeacher=Mymeta(‘OldboyTeacher‘,(object,),{...})
    school = Oldboy

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def score(self):
        print(%s is scoring %self.name)
print(OldboyTeacher.__dict__)

自定义一个元类来控制类的实例化:

  (关键点:__call__内置方法 是在对象产生完成之后再调用这个产生的对象而自动调用的方法)

class Mymate(type):
    def __call__(self,*args,**kwargs):
        obj = self.__new__(self)
        obj.__init__(obj,*args,**kwargs)
        return obj
class OldboyTeacher(object,metaclass=Mymeta): 
    school = Oldboy

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def score(self):
        print(%s is scoring %self.name)

tea1=OldboyTeacher(egon,18,male) # 会触发OldboyTeacher的类(即元类)中的    __call__函数
tea1()

 

以上是关于学习日记0827异常处理 元类 自定义元类 自定义元类来实例化类 属性查找顺序的主要内容,如果未能解决你的问题,请参考以下文章

3.1.18 元类的练习

具有自定义元类行为的 Python 元类

在 SQLAlchemy 中创建混合属性的自定义元类

自定义元类和元类的用途

面向对象之元类

2.自定义元类控制类的创建行为