正常情况下,当我们定义了一个 class
,创建了一个 class
的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。
但是,如果我们想要限制实例的属性怎么办?比如,只允许对 Student
实例添加 name
和 score
属性。
为了达到限制的目的,Python 允许在定义 class
的时候,定义一个特殊的 __slots__
变量,来限制该 class
实例能添加的属性:
class Student(object):
__slots__ = ('name', 'score')
def __init__(self, name, score):
self.name = name
self.score = score
测试一下:
>>> bart.score = 99
>>> bart.score
99
>>> bart = Student('bart', 60)
>>> bart.age = 12
......
AttributeError: 'Student' object has no attribute 'age'
由于 'age'
没有被放到 __slots__
中,所以不能绑定 age
属性,试图绑定 age
将得到 AttributeError
的错误。
使用 __slots__
要注意,__slots__
定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。
除非在子类中也定义 __slots__
,这样,子类实例允许定义的属性就是自身的 __slots__
加上父类的 __slots__
。