如何正确定义子类属性

时间:2014-09-11 12:17:43

标签: python class attributes subclass

我有一个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'

为什么呢?我该如何解决这个问题?

5 个答案:

答案 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

  

我该如何解决这个问题?

您可以使用以下几种方法来纠正您的代码:

  1. Python是动态语言,您可以在对象名称空间中显式添加新名称:

    name
  2. 使用 >>> p.name = "grijesh" >>> p.__dict__ # Now `p` has 'name' attributes {'name': 'grijesh'} >>> p.display() # it is safe to call display Name: grijesh 函数作为@Tasawer Nawaz的回答建议。

  3. 使用setname函数并在@ T.C.的答案中实现对象构造函数。

  4. 基本上在所有技术中,您在__init__函数方法访问它之前将'name'属性附加到SubPerson实例对象。

答案 3 :(得分:0)

setname声明之前致电print

答案 4 :(得分:0)

您应该明确调用

p.setname("name")
在访问之前