学习日记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异常处理 元类 自定义元类 自定义元类来实例化类 属性查找顺序的主要内容,如果未能解决你的问题,请参考以下文章