一、使用__slots__
1. python是动态语言,允许在创建类的实例后,给实例绑定属性和方法。
1.1. 绑定属性:obj.NewAttr = value.
1.2 绑定方法:
1.2.1 第一步定义一个函数:def NewMethod(self, other param):
1.2.2 第二步导入types模块中的MethodType函数:from types import MethodType
1.2.3 第三步赋值函数名给实例:obj.NewMethod = MethodType(NewMethod, obj)
1.3 创建类后,允许给类动态添加属性和方法,新添加的属性和方法后,之后创建的所有实例都能访问。
2. 在定义类时,在类内部给特殊变量__slots__赋值,来限制给类实例动态绑定的属性。
2.1 __slots__ = ('attr1', 'attr2', 'attr3')。在创建实例后,只能给实例动态绑定attr1, attr2或attr3属性。
2.2 __slots__,父类和子类
2.2.1 父类定义了__slots__,子类没有。则子类子类实例可以绑定任意属性。
2.2.2 父类没有定义__slots__,子类有。则子类子类实例可以绑定任意属性。
2.2.3 父类和子类都定义了__slots__。则子类子类实例可以绑定的属性是父类__slots__和子类__slots__的并集。
二、使用@property
1. python内置的@property装饰器负责把方法变成属性调用。可以达到对属性取值范围检查的目的。
2. @property下的方法定义的是属性的getter方法。方法名为属性名称。
3. @AttrName.setter下的方法定义的是属性AttrName的setter方法。方法名为属性名称,即AttrName。
4. 只定义@property,不定义@AttrName.setter,可以定义只读属性。