我有一棵有数十万个节点的大树,我正在使用__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
错误?我知道我的示例是人为的,在实际程序中不太可能是故意的,但这并没有使这种行为变得不那么奇怪。
谢谢,
乔纳森