使用 __slots__

正常情况下,当我们定义了一个 class,创建了一个 class 的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。

但是,如果我们想要限制实例的属性怎么办?比如,只允许对 Student 实例添加 namescore属性。

为了达到限制的目的,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__

你可能感兴趣的:(使用 __slots__)