python提供了两大类属性管理的方法,分别是:1. 基于运算符重载 2. 基于descriptor协议
基于运算符重载的属性管理方法
|
|
防止循环调用的方法: 1. 使用属性字典 2. 调用父类的方法 3. 调用其他对象的方法
__getattr__和__getattribute__一般用在实现委托器模式的代码中。
|
|
基于descriptor协议的属性管理方法
基于descriptor的属性管理方法必须在新式类中使用。
|
|
基于property的属性管理方法
property是descriptor协议的一种特例,基于property的属性管理方法必须在新式类中使用。
|
|
使用装饰器的property
|
|
进阶篇
__getattr__和__getattribute__需注意的点
正常的函数调用,会按照之前的规则拦截,但是对于重载函数的调用,拦截规则如下:
- 在3.x里,对于重载函数的隐式调用,__getattr__和__getattribute__不会拦截,显式调用会拦截
- 在2.6里,对于重载函数,无论显式调用还是隐式调用,若没有在类中定义,则__getattr__会拦截
- 在2.6里,对于重载函数的隐式调用,__getattribute__不会拦截,显式调用会拦截
2.6
类别 | 隐式调用 | 显式调用 |
---|---|---|
__getattr__ | 若没定义则拦截 | 若没定义则拦截 |
__getattribute__ | 不拦截 | 拦截 |
3.0
类别 | 隐式调用 | 显式调用 |
---|---|---|
__getattr__ | 不拦截 | 若没定义则拦截 |
__getattribute__ | 不拦截 | 拦截 |
property与descriptor的关系
既然property是descriptor的一种特例,那么它们之间是什么关系?
|
|
__slots__也是基于descriptor协议实现的。
三者之间的关系
- __getattr__和__getattribute__一般用在实现委托器模式的代码中。一般用来管理内嵌对象的属性访问
- property和descriptor一般用来管理某个类的特定属性。