【问题标题】:Inheritance and init method in PythonPython中的继承和init方法
【发布时间】:2011-07-07 04:37:00
【问题描述】:

我是 python 的初学者。我看不懂继承和__init__()

class Num:
    def __init__(self,num):
        self.n1 = num

class Num2(Num):
    def show(self):
        print self.n1

mynumber = Num2(8)
mynumber.show()

结果:8

没关系。但我将Num2 替换为

class Num2(Num):
    def __init__(self,num):
        self.n2 = num*2
    def show(self):
        print self.n1,self.n2

结果:Error. Num2 has no attribute "n1".

在这种情况下,Num2如何访问n1

【问题讨论】:

    标签: python inheritance init


    【解决方案1】:

    在第一种情况下,Num2 扩展了 Num 类,并且由于您没有在 Num2 中重新定义名为 __init__() 的特殊方法,因此它继承自 Num

    当一个类定义一个__init__() 方法,类实例化 自动调用__init__() for 新创建的类实例。

    在第二种情况下,由于您要在 Num2 中重新定义 __init__(),如果您想扩展其行为,则需要显式调用超类 (Num) 中的那个。

    class Num2(Num):
        def __init__(self,num):
            Num.__init__(self,num)
            self.n2 = num*2
    

    【讨论】:

    • 您的引用不足以解释为什么在派生类中未定义 __init__ 方法时,它会被继承。这是因为 " 如果在类中找不到请求的属性,则搜索继续在基类中查找。" (doc)
    • 对不起......继承的工作原理基本上是这样......如果你继承一个类,你会得到整个包,所以,超类中的所有内容都存在于子类中。但是,如果你重新定义一个方法,它会被覆盖......这就是你的代码中的内容。
    • @mario-duarte 有什么比super(Num2, self).__init__(num)更好的理由吗?
    • 我刚刚从这个答案中提出的解决方案切换到使用super,我的程序现在加载速度快了几秒钟。不知道为什么。
    • super 在使用多重继承时应该很有帮助。对于单继承,它的好处并不明显。
    【解决方案2】:

    当你重写 init 时,你还必须调用父类的 init

    super(Num2, self).__init__(num)
    

    Understanding Python super() with __init__() methods

    【讨论】:

    • super(Num2,self).__init__(num)
    【解决方案3】:

    像这样对 Num2 类进行简单更改:

    super().__init__(num) 
    

    它适用于python3。

    class Num:
            def __init__(self,num):
                    self.n1 = num
    
    class Num2(Num):
            def __init__(self,num):
                    super().__init__(num)
                    self.n2 = num*2
            def show(self):
                    print (self.n1,self.n2)
    
    mynumber = Num2(8)
    mynumber.show()
    

    【讨论】:

    • 这就是我喜欢stackoverflow的原因。尽管这不是问题的答案,但它很有帮助。有时人们发布的答案是人们应该提出的问题的答案。谢谢!
    【解决方案4】:

    由于您不调用 Num.__init__ ,因此永远不会创建字段“n1”。调用它,它就会在那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      相关资源
      最近更新 更多