考虑一个简单的类:
class A:
__slots__ = ('a',)
是什么a
?这是一个描述符:
>>> type(A.a)
<class 'member_descriptor'>
值中的每个字符串__slots__
都用于通过该名称创建一个具有member_descriptor
值的类属性。
这意味着您可以(尝试)通过A.a.__get__
>>> a = A()
>>> a.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: a
分配给它A.a.__set__
>>> a.a = 7
并尝试再次访问它:)
>>> a.a
7
您不能做的是尝试分配给实例上的任何其他属性:
>>> A.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'A' has no attribute 'b'
>>> a.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'b'
>>> a.b = 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'b'
的存在__slots__
不仅会创建请求的类属性,还会阻止在实例上创建任何其他属性。