我有一个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'
为什么呢?我该如何解决这个问题?
答案 0 :(得分: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对象的属性..我会实现 str 方法来打印你的对象,就像在C ++ std::operator<<
中一样。
你的子类看起来像这样:
class SubPerson(Person):
def __str__(self):
return "Name: {0}".format(self.name)
还有一些其他方法( len ,获取等等),您可以为自己的类覆盖..
答案 1 :(得分:1)
请设置&#34; name&#34;第一
p.setname("your_name")
或者如果您不想设置名称,则初始化父类中的名称属性
class Person:
name = "your_name"
答案 2 :(得分:1)
<强>为什么吗
您应该阅读异常消息:“AttributeError:SubPerson实例没有属性'name'
”,这清楚地表明您在main using expression {中创建的SubPerson
实例p
{1}}没有属性 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']
>>>
从Person类继承的属性是'display','setname'而不是p
。
我该如何解决这个问题?
您可以使用以下几种方法来纠正您的代码:
Python是动态语言,您可以在对象名称空间中显式添加新名称:
name
使用 >>> p.name = "grijesh"
>>> p.__dict__ # Now `p` has 'name' attributes
{'name': 'grijesh'}
>>> p.display() # it is safe to call display
Name: grijesh
函数作为@Tasawer Nawaz的回答建议。
使用setname
函数并在@ T.C.的答案中实现对象构造函数。
基本上在所有技术中,您在__init__
函数方法访问它之前将'name'
属性附加到SubPerson实例对象。
答案 3 :(得分:0)
在setname
声明之前致电print
。
答案 4 :(得分:0)
您应该明确调用
p.setname("name")
在访问之前