【问题标题】:AttributeError: 'child' object has no attribute '_name'AttributeError:“子”对象没有属性“_name”
【发布时间】:2013-05-13 17:54:47
【问题描述】:

我是 Python 的初学者,并试图理解类继承。但是当我尝试下面的代码时,我得到了这个错误:

AttributeError: 'child' object has no attribute '_name'

这是代码:

class parent:
    def __init__(self):
        self._name = "Smith"

    @property
    def name(self):
        return self._name

class child(parent):
    def __init__(self, childname):
        self._childname = childname

    def getname(self):
        return "child : {} .. parent : {}".format(self._childname, super().name)

def main():
    Dad = parent()
    Son = child("jack")
    print(Son.getname())

if __name__ == "__main__":
    main()

这是为什么呢?我是否正确理解 Python 中的类继承?

【问题讨论】:

  • __name__ 代替_name 怎么样?
  • __xxx__ 形式的名称保留供 Python 本身使用。
  • 您是否真的在尝试编写在 Python 2.7 和 Python 3.x 中运行的代码?如果没有,你想回答哪一个? (在这种情况下会有所不同。)

标签: python inheritance python-2.7 python-3.x


【解决方案1】:

您的问题实际上发生在这里:

def getname(self):
    return "child : {} .. parent : {}".format(self._childname, super().name)

更准确地说,super().name 是罪魁祸首:不仅super() 没用,而且你应该调用name() 而不是name,但是如果你查看name() 的代码,你会注意它使用了变量_name

但是,_name 是在父级的 __init__ 方法中初始化的。如果你想调用它,你应该总是在孩子的方法中调用父 __init__ 方法,它不是自动完成的。您的孩子__init__ 方法应该是:

class child(parent):
    def __init__(self, childname):
        super().__init__()
        self._childname = childname

【讨论】:

  • 我会在“你应该总是……”之前添加“如果你希望父母的__init__ 被调用”,尽管提问者确实希望这种情况发生。
  • 如何在子类构造函数中传递父类的实例并在任何地方使用它而不是super()。你认为什么更有效率?
  • @RafaelAdel 我不这么认为。实际上,您不必总是打电话给super()。例如,您使用了super().name(),但name() 就足够了,因为您没有在child 中覆盖函数name
  • 仅供参考,super() 的语法在 Python 2.7 中不起作用。您必须包含子对象的名称。例如super(child, self).__init__() 或在下面使用 Seth 的答案。
  • @Phil 好吧,我认为这对他有用,因为 OP 已经在他的示例中使用了它。
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 2021-04-19
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多