Python 中的继承和 init 方法

我是蟒蛇初学者,我不懂继承和 __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".

In this case, how can Num2 access n1?

155561 次浏览

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

super(Num2, self).__init__(num)

使用 _ _ init _ _ ()方法理解 Python super ()

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

类定义 __init__()时 方法、类实例化 automatically invokes __init__() for the newly-created class instance.

在第二种情况下,因为要在 Num2中重新定义 __init__(),所以如果要扩展它的行为,就需要显式调用超类(Num)中的 __init__()

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

因为您不调用 Num.__init__,所以永远不会创建字段“ n1”。调用它,它就会出现。

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