Why?
你应该阅读异常消息:“AttributeError的:SubPerson实例没有属性'name'
”,这清楚地表明,你已经在使用的主要表达p = SubPerson()
创建SubPerson
的实例p
没有属性'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'
可以用内省技术使用__dict__
和继承使用dir()
功能属性的p
所有属性列表,请参阅下面
>>> p.__dict__
{} # p don't have it any it own attribute
>>> dir(p) # either don't inerited attribute 'name'
['__doc__', '__module__', 'display', 'setname']
>>>
通知只是属性,从Person类p
继承是“显示器','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'
属性在display()
函数法访问它之前SubPerson实例对象。
你永远不会调用'setname',父母和孩子都不会有'__init__' - 你期望发生什么? – jonrsharpe 2014-09-11 12:20:03
即使你使'p'成为Person,它也不起作用:它与子类化无关。 – 2014-09-11 12:34:23
我是否正确回答了您的问题? – Oni1 2014-09-11 13:18:09