2011-03-02 78 views
39

我是python的执行者。我无法理解继承和__init__()Python中的继承和初始化方法

class Num: 
    def __init__(self,num): 
     self.n1 = num 

class Num2(Num): 
    def show(self): 
     print self.n1 

mynumber = Num2(8) 
mynumber.show() 

结果:8

这是可行的。 Error. Num2 has no attribute "n1".

在这种情况下,怎么能Num2访问n1:但是我

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

结果替换Num2

回答

72

的初始化在第一种情况下,Num2是扩展类Num因为你不重新定义特殊方法__init__()Num2,它从Num继承。

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

在第二种情况下,因为你是在Num2重新定义__init__()你需要显式调用之一,如果你想扩展它的行为的超类(Num)。

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

您的引用不足以解释为什么在派生类中未定义'__init__'方法时,它会被继承。这是因为_“如果在该类中没有找到请求的属性,搜索将继续查找基类。”_(doc) – eyquem 2011-08-14 22:08:22

+0

对不起......基本上,继承是如何工作的......如果继承一个类,你得到整个包,所以,超类中的所有东西都存在于子类中。但是,如果你重新定义了一个方法,它会被覆盖......这就是你的代码。 – coya 2017-05-05 19:46:09

2

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