Python中的继承和初始化方法


94

我是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

Answers:


148

在第一种情况下,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

23
您的引文不足以解释为什么在未__init__在派生类中定义方法时会继承该方法。这是因为“如果在类中找不到请求的属性,则搜索将继续查找基类。” (doc)
eyquem 2011年

5
对不起...这基本上就是继承的工作原理...如果继承一个类,则会得到整个包,因此,超类中的所有内容都存在于子类中。但是,如果您重新定义一个方法,它将被覆盖...这就是代码中的内容。
coya

4
@ mario-duarte为什么会有什么比这更好的理由super(Num2, self).__init__(num)
吉瓦尔

1
我刚刚从此答案中提出的解决方案切换为using super,并且我的程序现在加载速度提高了几秒钟。不知道为什么。
Guimoute

super在使用多重继承时应该会有所帮助。对于单一继承,其好处并不明显。
Johann Bzh



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()

1
这就是为什么我喜欢stackoverflow。即使这不是问题的答案,它也很有帮助。有时,人们发布的答案就是人们应该一直在问的问题的答案。谢谢!
汤普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.