Eri*_*got 6 python attributes slots
在下面的示例中,属性x是从对象的插槽中访问的,即使x存在__dict__(这不是典型的或可能有用的情况,但我很好奇):
>>> class C(object):
... __slots__ = 'x'
...
>>> class D(C):
... pass
...
>>> obj = D()
>>> obj.x = 'Stored in slots'
>>> obj.__dict__
{}
>>> obj.__dict__['x'] = 'stored in __dict__'
>>> obj.x
'Stored in slots'
Run Code Online (Sandbox Code Playgroud)
这种访问顺序(插槽优先)是记录在案的行为吗?或者只是一个实现细节?
Mar*_*ers 10
是的,__dict__只有在查阅了数据描述符之后才查阅对象.__slots__属性作为数据描述符实现.
请参阅调用描述符:
对于实例绑定,描述符调用的优先级取决于定义的描述符方法.描述符可以定义的任何组合
__get__(),__set__()和__delete__().如果它没有定义__get__(),那么访问该属性将返回描述符对象本身,除非对象的实例字典中有值.如果描述符定义__set__()和/或__delete__(),则它是数据描述符; 如果它既不定义,则它是非数据描述符.通常情况下,数据描述符同时定义__get__()和__set__(),非数据描述符刚才的__get__()方法.带有__set__()和__get__()定义的数据描述符总是覆盖实例字典中的重定义.相反,非数据描述符可以被实例覆盖.
并从同一页面,插槽部分:
__slots__通过为每个变量名创建描述符(实现描述符)来在类级别实现.因此,类属性不能用于设置由__slots__; 定义的实例变量的默认值; 否则,class属性将覆盖描述符赋值.