Когда вы префикс атрибута с двойным подчеркиванием, Python использует 'name mangling' для доступа к атрибуту. Это означает, что он сохранит атрибут класса в формате: _<class name>__<attr name>
. В вашем примере self.__label
будет сохранен как self._B__label
, потому что вы установите его в методе класса B. Но когда вы пытаетесь использовать атрибут в классе A, он преобразует self.__label
в self._A__label
и обнаруживает, что он не установлен.
Вариант использования для двойных подчеркиваний - это то, что вы хотите, чтобы ваша переменная всегда была на вашем классе, даже если подкласс получает ваш класс. Потому что может случиться, что подкласс переопределяет вашу переменную на что-то другое, используя двойные подчеркнутые переменные, что делает это намного сложнее.
Что не так: вы используете переменные с двойным подчеркиванием. Как исправить это: не используйте переменные с двойным подчеркиванием. –
Почему это не разрешено? Он скрыт от внешнего мира, но я использую метод, определенный внутри родительского класса. Почему возникает проблема? – Physicist
Потому что двойные подчеркивания * точно *, чтобы остановить доступ (или переписать) родительскими или дочерними классами. Они почти никогда не то, что вы хотите; не используйте их. –