阅读了fluent python的metaprogramming这一大章节,下面对阅读后产生的感想做一下总结。
首先是关于对象 属性 访问的4个protocol
按照理解可以划分为
__getattribute__
和
__getattr__ __setattr__ __delattr__
这样划分是因为 __getattribute__ 方法只有在对象有该属性时,需要get 对象的某个属性值时,才会执行该方法,可以将这个方法理解为 属性的只读, 我想这也是为什么它和其他三个方法名字不一样的原因
__getattr__会在没有找到该属性的时候执行,__setattr__用来增加一个属性,__delattr__用来删除一个属性。
然后是property和descriptor
之所以有这些是因为希望 访问对象属性时,能够控制 对象属性 get,set,del 的过程
property就是 python语言自带的 descriptor, 所以它功能不够定制化,一些类所拥有的优点(例如 类可以继承, 类可以带有类属性)这些property都不支持。
所以在property的基础上 有了 descriptor
最后是metaclass
这是因为某些场景 例如ORM,Django中的validator,这个时候人们希望能够 控制类的属性
1. 首先想到的方式是class decorator, 但是这种方式的缺点是 这种方式是基于函数的, 所以不像class一样能够继承
2. 然后人们想到了 metaclass,
首先明确一点,type 是python语言自带的 metaclass, 在声明class的时候,背后的机理就是type(classname, bases, attr_dict), 背后就是type这个metaclass生成了 class
但是type由于是自带的,很显然不能定制化, 所以有时候就需要人们自己编写 metaclass
自己编写的 metaclass继承 type ,所以继承了type能够创建 class的能力(我想这就是继承的含义: 子类 能够继承 父类的能力)