我是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
?
答案 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)
答案 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()