Я новичок в python, и я не был уверен, что я делаю это правильно. У меня есть базовый класс A
и унаследованный класс B
.Наследование свойств Python
class A(object):
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
class B(A):
def __init__(self, name):
super(NominalValue, self).__init__(name)
@property
def name2(self):
return self.__name2
@name2.setter
def name2(self, n):
self.__name2 = n
def toString():
print self.__name + self.__name2
if __name__ == "__main__":
instance = B('name');
instance.toString()
При запуске этого он жалуется, что класс B
не имеет атрибут __name
.
AttributeError: 'B' object has no attribute '_B__name'
Я явно не делаю наследование правильно. Как вы относитесь к правильному унаследованию свойств и избегаете повторения атрибутов в унаследованном классе?
Двойное подчеркивание имеет [специальное значение] (https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references), которое мешает вашему наследованию. Чтобы получить доступ к атрибуту '__name' суперкласса, я думаю, вам нужно называть его« self._A__name ». –
Как упоминает 6502 в своем ответе, вы не должны обязательно * ПЛАНИРОВАТЬ * при написании имущества для своего класса.Это одна из сильных сторон свойств в Python: очень легко преобразовать атрибут в свойство «на лету». Если это не доказывает, что вам нужна пользовательская логика для получения, установки или удаления атрибута - не используйте свойство для этого. –