Why?
Вы должны прочитать сообщение об исключении: «AttributeError: экземпляр SubPerson не имеет атрибута 'name'
», что явно указывает, что экземпляр SubPerson
«s p
, что вы создали в основной, используя выражение p = SubPerson()
не атрибут'name'
- поэтому он выбрасывает исключение AttributeError
.
Позволяет попробовать код на активном интерпретатором и увидеть:
>>> class Person:
... def setname(self, name):
... self.name = name
... def display(self):
... print(self.name)
...
>>> class SubPerson(Person):
... def display(self):
... print("Name: {0}".format(self.name))
...
>>> p = SubPerson()
>>> p.name # Notice
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: SubPerson instance has no attribute 'name'
>>>
Извещение линии p.name
- вы получаете то же самое исключение! Действительно p
не имеет атрибута с именем 'name'
вы можете использовать метод самоанализа, чтобы перечислить все атрибуту p
с помощью __dict__
и наследственных атрибуты с помощью dir()
функции см ниже
>>> p.__dict__
{} # p don't have it any it own attribute
>>> dir(p) # either don't inerited attribute 'name'
['__doc__', '__module__', 'display', 'setname']
>>>
Уведомления только атрибутов, которые p
наследует от класса Person является «дисплей ',' setname ', но не name
.
How can I fix this?
У вас есть несколько методов, чтобы исправить свой код, как показано ниже:
Python является динамическим языком вы можете явно добавить новое имя в объекте имен, как:
>>> p.name = "grijesh"
>>> p.__dict__ # Now `p` has 'name' attributes
{'name': 'grijesh'}
>>> p.display() # it is safe to call display
Name: grijesh
Используйте свой setname
функция как предложение ответа Tasawer Nawaz.
Использовать функцию __init__
и реализовать конструктор объекта, как дать ответ @ T.C.
В основном во всех технике вы подключаете 'name'
атрибут SubPerson экземпляр объекта перед его загрузкой в display()
метода функции.
Вы никогда не называете 'setname', и ни у родителя, ни у ребенка нет' __init__' - что вы ожидали? – jonrsharpe
Это не сработает, даже если вы создали 'p' Person: это не имеет никакого отношения к подклассу. –
Я правильно ответил на ваш вопрос? – Oni1