我有一棵有成千上万个节点的大树,我使用__slots__
来减少内存消耗。我只是发现了一个非常奇怪的错误并修复了它,但我不明白我看到的行为。Python,__slots__,继承和类变量==>属性是只读错误
下面是一个简单的代码示例:
class NodeBase(object):
__slots__ = ["name"]
def __init__(self, name):
self.name = name
class NodeTypeA(NodeBase):
name = "Brian"
__slots__ = ["foo"]
我然后执行以下命令:
>>> node = NodeTypeA("Monty")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __init__
AttributeError: 'NodeTypeA' object attribute 'name' is read-only
有没有错误,如果没有定义NodeTypeA.name
(边注:该属性是有错,并没有理由在那里)。如果NodeTypeA.__slots__
从未定义过,那么也没有错误,因此它有__dict__
。
我不明白的是:为什么超类中的类变量的存在会干扰在子类中的插槽中设置实例变量?
任何人都可以解释为什么这个组合导致object attribute is read-only
错误?我知道我的例子是人为的,在一个真正的程序中不太可能是有意的,但是这并不会使这种行为变得不那么奇怪。
谢谢,
乔纳森
'NodeTypeA'被创建类变量'name'和不将值分配给在'NodeBase'定义的实例变量。这是故意的吗? – unholysampler 2011-04-22 17:23:51
起初并不是故意的 - 我在代码中意外地发现了这个问题,导致了我所问的错误。但后来我很好奇为什么代码的行为就像它一样,所以我故意将它放在我的代码示例中。 – Jonathan 2011-04-22 17:52:06