113

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

4 回答 4

176

在第一种情况下,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
于 2011-03-02T11:06:07.430 回答
41

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

super(Num2, self).__init__(num)

使用 __init__() 方法理解 Python super()

于 2011-03-02T11:02:29.207 回答
13

像这样对 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()
于 2019-12-09T20:01:11.307 回答
4

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

于 2011-03-27T17:50:49.713 回答