面对对象进阶
1.mixins机制
为解决多继承的关系混乱问题,将父类分为主类和辅类.主类才是主要要继承的,辅类通常只有一个功能(功能较少).
在类命名的时候以Mixin,able结尾的,认为是辅类,继承的时候写在主类前面,可以有多个,主类只有一个.
本质还是多继承。
2.内置方法
在某些条件下会自动执行的方法称为内置方法
__init__
在实例化的时候自动运行
__str__
在print对象的时候自动运行类中的__str__,并打印返回值
__del__
在清理对象的时候自动运行,可以是主动调用,也可以是程序结束的时候自动调用,主要用于释放对象中某些属性占用的操作系统资源。调用方式:del 对象。
还有很多
3.反射
目的:可以通过字符串来操作对象的属性
定义:在程序运行中,能自动获知类或对象的属性,并且可以调用
怎么实现?
老方法:(不推荐)
obj.__dict__返回属性字典
dir(obj)返回属性列表
python提供的4个内置函数,可以通过字符串来操作对象的属性:
hasattr:判断对象有没有该属性 hasattr(obj,"name") 返回True or False
getattr:获取属性的值或绑定方法,绑定方法可以加括号运行 getattr(obj,"name") 返回obj.name
setattr:修改 setattr(obj,"name","EGON") 相当于obj.name="EGON"
delattr:删除 delattr(obj,"name") 相当于del obj.name
4.元类(没讲)
元类就是定义类这个对象的"类",即"type"
class产生类的机制】
1.类名
class_name
2.类的基类
class_bases
3.运行类体代码,产生名称空间
class_body="""代码"""
class_dic ={}
exec(class_body,{},class_dic)
4.调用元类
"类名"=type(class_name,class_bases,class_dic)
如何自定义元类来控制类的产生?
自定义元类一定要继承元类
class my_class(metaclass="自定义元类")
__new__是定义在元类中的,和init类似
实例化中造一个空对象的本质就是调用了__new__方法
自定义类的产生或者说实例化的过程分为:
1.先造一个空对象=>类 调用__new__
2.调用元类(类)中的init方法,完成类的初始化
3.返回初始化好的类
上面的三部本质是调用了__call__方法
但凡可以加括号运行的对象,其类中都有__call__方法
补充
isinstance(“aaa”,int)#判断是不是该类型
issubclass()#判断是不是子类
raise 主动抛出异常
raise NameError("错误提示")