Python, __slots__, наследование и переменные класса ==> атрибут доступен только для чтения

У меня есть большое дерево с сотнями тысяч узлов, и я использую __ 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 __ .

Я не понимаю, почему существование переменной класса в суперклассе мешает установке переменной экземпляра в слоте дочернего класса?

Может ли кто-нибудь объяснить, почему эта комбинация приводит к ошибке атрибута объекта только для чтения ? Я знаю, что мой пример надуман и вряд ли будет преднамеренным в реальной программе, но это не делает такое поведение менее странным.

Спасибо, Джонатан

15
задан Mr_and_Mrs_D 10 December 2016 в 15:06
поделиться