Python中的继承

问题描述:

我在理解Python中的继承时遇到了一些困难。我是当Class BClass A继承它继承了所有我做了一个例子是在A.初始化的值来证明我的意思的印象是:Python中的继承

Class A(): 
    def __init__(self,parameter): 
     self.initialize_parameter=4*parameter 

Class B(A): 
    def __init__(self): 
     pass 

    def function(self,another_parameter): 
     return self.initialize_parameter*another_parameter 

但在这种情况下,调用:

B_instance=B() 
print B_instance.function(10) 

返回一个AttributeError说,B类不没有self.initialized_parameter

所以我的问题是,我必须复制和所有的初始化从A粘贴手动B或有一种方法,我可以在B中使用它们而无需调用A类本身? (我希望这很清楚)。

如果你想使用父类的构造函数中的行为,您应不覆盖它:

Class B(A): 
    def function(self,another_parameter): 
    return self.initialize_parameter*another_parameter 

或者,如果你想扩展初始化行为,你可以使用super()

Class B(A): 
    def __init__(self, parameter) 
    super(B, self).__init__(2*parameter) 

    def function(self,another_parameter): 
    return self.initialize_parameter*another_parameter 

在Python 3中,super()不需要显式参数(super().__init__())。

此一般覆盖行为和super()适用于所有方法,而不仅仅是构造函数。

+0

好的答案尼罗河。Python中的继承通常很混乱,但是你总结得很好。 – bsa

初始化基类的唯一方法是在B __init__()方法中使用super().__init__()。请参阅:Understanding Python super() with __init__() methods

您必须使用内置super为了做必要的初始化父类,如下所示:

class B(A): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

如果你不使用Python 3,你可能需要做的它是这样的:

class B(A): 
    def __init__(self, *args, **kwargs): 
     super(A, self).__init__(*args, **kwargs) 

基本上这个电话A的,如果你想引用A这是需要__init__功能的方法和属性。

你是从这里开始的超类中重写构造:

def __init__(self): 
    pass 

所以,self.initialize_parameter永远不会被初始化。

删除该方法,它应该工作。

超类的__init__仅在子类中未指定__init__时才自动调用。所以你不应该在B类中定义__init__,除非你需要。 如果在B类中指定__init__,则必须手动调用超类中的__init__。我更喜欢这样称呼它:A.__init__(self,'provide_initialize_parameter_here')。其他人更喜欢使用super