У меня есть большое дерево с сотнями тысяч узлов, и я использую __ 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 __
.
Я не понимаю, почему существование переменной класса в суперклассе мешает установке переменной экземпляра в слоте дочернего класса?
Может ли кто-нибудь объяснить, почему эта комбинация приводит к ошибке атрибута объекта только для чтения ? Я знаю, что мой пример надуман и вряд ли будет преднамеренным в реальной программе, но это не делает такое поведение менее странным.
Спасибо, Джонатан