day29

反射:

什么是反射?指的是在程序运行过程中可以“动态”获取对象的信息(属性和功能)
为什么用反射?python是动态语言,反射被视为动态语言的关键
如何使用反射?
实现反射机制的步骤:
1.先通过dir查看某一个对象下的属性
2.通过字符串反射到真正的属性上,得到属性值
四个内置函数的使用,通过字符串来操作属性
hasattr() hasattr(object,'name')
getattr() getattr(object, 'name', default=None)
setattr() setattr(x, 'y', v)
delattr() delattr(x, 'y')
静态语言反射机制的意义?

内置方法__str__,__del__
__str__方法会在对象被打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型
__del__会在对象被删除时自动触发。由于Python自带的垃圾回收机制会自动清理Python程序的资源,所以当一个对象只占用应用程序级资源时,完全没必要为对象定制__del__方法,但在产生一个对象的同时涉及到申请系统资源(比如系统打开的文件、网络连接等)的情况下,关于系统资源的回收,Python的垃圾回收机制便派不上用场了,需要我们为对象定制该方法,用来在对象被删除时自动触发回收系统资源的操作
元类:什么是元类?
引入:一切皆对象
元类就是用来实例化产生类的类
我们用class关键字定义的所有的类都是由内置的type元类来产生的
class关键字创造类的过程:
类有三大特征:类名 类的父类 执行类体代码拿到类的名称空间
调用元类依次传入上述三个特征
如何自定义元类来控制类的产生:
一个类没有声明自己的元类,默认他的元类就是type,除了使用内置元类type,我们也可以通过继承type来自定义元类,然后使用metaclass关键字参数为一个类指定元类
类的产生过程其实就是元类的调用过程
调用类发生了三件事:
先造了一个空对象 调用类内的__new__方法
调用Mymeta类内的__init__方法,完成初始化对象
返回初始化好的对象 调用__call__方法
属性查找:属性查找应该分成两层,一层是对象层(基于c3算法的MRO)的查找,另外一个层则是类层(即元类层)的查找
查找顺序:
1、先对象层:StanfordTeacher->Foo->Bar->object
2、然后元类层:Mymeta->type

posted @ 2020-04-15 21:21  TopJocker  阅读(100)  评论(0编辑  收藏  举报