2015-11-12 3 views
1

У меня есть следующие классы:ошибка при использовании метода, определенного родительского класса

class A: 
    def name(self): 
     return self.__label 

class B(A): 
    def __init__(self, name) 
     self.__label = name 

ex1 = B('Tom') 
print ex1.name() 

Что я получаю:

AttributeError: B instance has no attribute '_A__label' 

Что не так и как это исправить?

+4

Что не так: вы используете переменные с двойным подчеркиванием. Как исправить это: не используйте переменные с двойным подчеркиванием. –

+0

Почему это не разрешено? Он скрыт от внешнего мира, но я использую метод, определенный внутри родительского класса. Почему возникает проблема? – Physicist

+1

Потому что двойные подчеркивания * точно *, чтобы остановить доступ (или переписать) родительскими или дочерними классами. Они почти никогда не то, что вы хотите; не используйте их. –

ответ

1

Когда вы префикс атрибута с двойным подчеркиванием, Python использует 'name mangling' для доступа к атрибуту. Это означает, что он сохранит атрибут класса в формате: _<class name>__<attr name>. В вашем примере self.__label будет сохранен как self._B__label, потому что вы установите его в методе класса B. Но когда вы пытаетесь использовать атрибут в классе A, он преобразует self.__label в self._A__label и обнаруживает, что он не установлен.

Вариант использования для двойных подчеркиваний - это то, что вы хотите, чтобы ваша переменная всегда была на вашем классе, даже если подкласс получает ваш класс. Потому что может случиться, что подкласс переопределяет вашу переменную на что-то другое, используя двойные подчеркнутые переменные, что делает это намного сложнее.

Смежные вопросы