Python中的继承和init方法

时间:2011-03-02 10:56:48

标签: 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()

结果: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

4 个答案:

答案 0 :(得分:104)

在第一种情况下,Num2正在扩展类Num,因为您没有在__init__()中重新定义名为Num2的特殊方法,所以它继承自Num 1}}。

  

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

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

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

答案 1 :(得分:24)

当你覆盖init时,你也要调用父类的初始化

super(Num2, self).__init__(num)

Understanding Python super() with __init__() methods

答案 2 :(得分:3)

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

答案 3 :(得分:0)

在Num2类中进行如下简单更改:

super().__init__(num) 
it works in 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()