限制__slot__
上一篇有提到通过动态绑定:在类外部定义方法,然后动态地给类加上新的功能,使得类的实例都能调用外部方法。
但如果要限制实例的属性,不允许动态地添加,该怎么办呢?
为了达到限制的目的,python允许在定义class的时候,定义一个特殊的 slots 变量,来限制该class实例动态添加属性。
那使用__slot__的好处呢?
- 防止用户随意动态增加实例属性;
- 节约内存,因为动态绑定时属性存储在__dict__中;
- 更快的属性访问速度。
例如:只允许对Student实例添加 name 和 age 属性。
>>> class Student(object):
... __slots__ = ('name','age') # 使用tuple定义允许绑定的属性名称
>>> s = Student() # 创建新的实例
>>> s.name = 'xlp' # 绑定属性name
>>> s.age = 24 # 绑定属性age
>>> s.score = 99 # 绑定属性score
# 但是score没有放到__slots__中,所以不能绑定score属性,报错。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
!!!但是__slots__
定义的属性只对当前类的实例起作用,对继承的子类是不起作用的。除非在子类中也定义__slots__
。
这样子类实例允许定义的属性就是自身的__slots__
+ 父类的__slots__
限定的属性。
例如:
>>> class SStudent(Student):
... __slots__ = 'gender'
...
>>> g = SStudent()
>>> g.name = 'xxx'
>>> g.score = 99 # 子类依旧可以动态绑定属性
>>> g.gender = 'Female'
>>> g.teacher = 'Mrs. Wang' # 不允许绑定咯~
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'SStudent' object has no attribute 'teacher'
子类SStudent除掉可以绑定name、age,还可以绑定定义在子类__slot__中的gender属性。
但是teacher属性没有在__slot__限制中,故不能动态绑定,会报错。
❤ thanks for watching, keep on updating...
点个赞再走吧
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。