__slots__
可以给实例绑定属性和方法。
但是,给一个实例绑定的方法,对另一个实例是不起作用的。
所以为了让所有实例都能使用这个方法,应该给class绑定方法。
__slots__用来限制实例的属性,在定义class的时候,定义一个特殊变量slots,可以用来限制。
__slots__
定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。
除非在子类中也定义__slots,这样就也可以集成到父类所限制的属性。
property
绑定属性时应该保护属性不被轻易修改并且检查参数。
又能检查参数又能用类似属性这样简单的方式访问类的变量。
可以把一个getter方法变成属性。
@property
的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property
就可以了,此时,@property
本身又创建了另一个装饰器@score.setter
,负责把一个setter方法变成属性赋值
我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。
定义只读属性:只定义getter,不定义setter
多重继承
class xxx(第一个类,第二个类)类与类无关
这种设计被称为Mixln,给一个类增加多个功能,通过多重组合来组合多个类的功能。
java只允许单一继承。
定制类
__str__
__iter__ 一个类像list或tuple一样被for循环,就要实现一个这个函数,返回一个迭代对象,
这个对象用到类中定义的__next__函数来拿到循环的下一个值。遇到StopIteration错误时
返回。
__getitem__:按下标取元素,如果想取切片,记得要判断一下是不是slice,是的话再次处理
__getattr__动态返回一个没有定义的属性,也可以返回函数 return lambda就行
这实际上可以把一个类的所有属性和方法调用全部动态化处理了,不需要任何特殊手段。
这种完全动态调用的特性有什么实际作用呢?作用就是,可以针对完全动态的情况作调用。
__call__ 能对实例直接进行调用
使用枚举类
每个常量都是这个类的一个唯一实例,Enum类
可以枚举它的所有成员。
value
属性则是自动赋给成员的int
常量,默认从1
开始计数。
可以从Enum派生出自定义类,@unique可以检查是否有重复值。
使用元类
type()
函数可以查看一个类型或变量的类型。
我们说class的定义是运行时动态创建的,而创建class的方法就是使用type()
函数。