Python中的继承和init方法

Yug*_*amo 70 python inheritance init

我是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()
Run Code Online (Sandbox Code Playgroud)

结果: 8

还行吧.但我换成Num2

class Num2(Num):
    def __init__(self,num):
        self.n2 = num*2
    def show(self):
        print self.n1,self.n2
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*rte 114

在第一种情况下,Num2是扩展类Num,因为你没有重新定义名为__init__()in 的特殊方法Num2,所以它继承自Num.

当类定义__init__() 方法时,类实例化会自动调用__init__()新创建的类实例.

在第二种情况下,由于您正在重新定义__init__(),因此如果要扩展其行为,则需要Num2在超类(Num)中显式调用该类.

class Num2(Num):
    def __init__(self,num):
        Num.__init__(self,num)
        self.n2 = num*2
Run Code Online (Sandbox Code Playgroud)

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

Mau*_*cco 25

当您覆盖init时,您还必须调用父类的init

super(Num2, self).__init__(num)
Run Code Online (Sandbox Code Playgroud)

使用__init __()方法理解Python super()


小智 10

Num2 类中的一个简单更改,如下所示:

super().__init__(num) 
Run Code Online (Sandbox Code Playgroud)

它适用于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()
Run Code Online (Sandbox Code Playgroud)

  • 这就是我喜欢 stackoverflow 的原因。尽管这不是问题的答案,但它很有帮助。有时,人们发布的答案是人们应该提出的问题的答案。谢谢你! (4认同)