Почему при наследовании объектов происходит переопределение имен, указанных в __slots__?

Какой может быть причиной изменения имени слота при отладке? Я ожидаю, что имя слота будет '__description', но вместо этого получаю '<имя класса>__description'. Как можно исправить это без переписывания классов?
Изображение к вопросу
  • 26 октября 2023 г. 6:38
Ответы на вопрос 3
При наследовании объектов в Python происходит не переопределение имен, указанных в `__slots__`, а скорее добавление новых слотов в класс-наследник. Это происходит потому, что слоты представляют собой фиксированный набор атрибутов для объекта, и при наследовании от родительского класса мы расширяем этот набор, добавляя новые слоты.

Относительно вашего вопроса о изменении имени слота при отладке, причиной может быть использование механизма именования слотов для разрешения конфликта имен, которые могут возникнуть при множественном наследовании. При определении слота, который имеет одно и то же имя, как в родительском, так и в дочернем классе, Python автоматически изменит имя слота в классе-наследнике, добавив имя родительского класса с префиксом в виде `_имя_родительского_класса`.

Для исправления этого можно использовать атрибут `__slots__` в классе-наследнике, повторно перечислив все слоты как в родительском классе, так и в дочернем классе. Тогда имена слотов останутся без изменений, и они будут использоваться вместо измененных имен.

Пример:
```python
class Parent:
    __slots__ = ['description']

class Child(Parent):
    __slots__ = ['description']
```

В этом случае имя слота останется '__description' и не будет изменено.
Удали двойное подчеркивание. Именно оно приводит к результату, который вам не нравится.
Измени двойное подчеркивание на одинарное. Если вы создаете атрибут с двойным подчеркиванием, то Python сохраняет этот атрибут в __dict__ или __slots__, добавляя одно нижнее подчеркивание и затем имя класса, например, _ClassName__attrname. Если вы удаляете двойное подчеркивание в __slots__ и оставляете одинарное, то имена атрибутов будут сохраняться так, как вы ожидаете.
Похожие вопросы