2014-09-11 3 views
2

У меня есть Person класс и подкласс SubPerson:Как правильно определить подкласс атрибута

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)) 


if __name__ == "__main__": 
    p = SubPerson() 
    p.display() 

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

File "./person.py", line 14, in display 
    print("Name: {0}".format(self.name)) 
AttributeError: SubPerson instance has no attribute 'name' 

Почему? Как я могу это исправить?

+4

Вы никогда не называете 'setname', и ни у родителя, ни у ребенка нет' __init__' - что вы ожидали? – jonrsharpe

+1

Это не сработает, даже если вы создали 'p' Person: это не имеет никакого отношения к подклассу. –

+0

Я правильно ответил на ваш вопрос? – Oni1

ответ

4
class Person: 
def __init__(self, name=""): 
    self.name=name 

#def setname(self, name): 
# self.name = name 

#instead of display 
def __str__(self): 
    return self.name 

#def display(self): 
# print(self.name) 

if __name__=='__main__': 
    p=Person("YourName") 
    print p 

Вы должны «инициализировать» ваш атрибут вашего объекта Person .. И я бы реализации этой ул метода для печати ваши объекты его как в C++ std::operator<< ..

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

class SubPerson(Person): 
def __str__(self): 
    return "Name: {0}".format(self.name) 

Есть некоторые другие методы (Len, получить, и так далее ..), которые вы можете переписать для собственного класса ..

0

позвонить setname befoure print заявление.

0

Вы должны явно вызвать

p.setname("name") 

перед обращением он

1

установите «имя» первого

p.setname("your_name") 

или если вы не хотите, чтобы установить имя, а затем инициализировать имя атрибут в родительском класс

class Person: 
     name = "your_name" 
+3

Использование атрибута class - это не путь. Вместо этого используйте атрибут экземпляра. – Matthias

1

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?

У вас есть несколько методов, чтобы исправить свой код, как показано ниже:

  1. Python является динамическим языком вы можете явно добавить новое имя в объекте имен, как:

    >>> p.name = "grijesh" 
    >>> p.__dict__   # Now `p` has 'name' attributes 
    {'name': 'grijesh'} 
    >>> p.display()   # it is safe to call display 
    Name: grijesh 
    
  2. Используйте свой setname функция как предложение ответа Tasawer Nawaz.

  3. Использовать функцию __init__ и реализовать конструктор объекта, как дать ответ @ T.C.

В основном во всех технике вы подключаете 'name' атрибут SubPerson экземпляр объекта перед его загрузкой в ​​display() метода функции.

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