【发布时间】:2012-12-24 04:09:09
【问题描述】:
class Foo(object):
__slots__ = ('a',)
class Bar(Foo):
@property
def a(self):
return super(Bar, self).a
super(Bar, Bar()).a = 4
如果我使用这个代码,这不起作用:
>>> super(Bar, Bar()).a = 4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'super' object has no attribute 'a'
为什么?
根据python docs、__slots__分别实现:
__slots__在类级别通过为每个变量名创建描述符(实现描述符)来实现。结果,类 属性不能用于设置实例变量的默认值 由__slots__定义;否则,类属性将覆盖 描述符分配。
但描述符可以处理继承(至少如果用纯 python 编写的话)。
有谁知道,为什么这不适用于__slots__?
编辑:如果你想写的话,似乎描述符通常不适用于super()(不过,读作品)。所以我的问题宁愿是:如果使用super() 调用,为什么描述符是只读的?
【问题讨论】:
标签: python python-2.7 cpython python-3.2 slots