Python中的继承
我在理解Python中的继承时遇到了一些困难。我是当Class B
从Class 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()
适用于所有方法,而不仅仅是构造函数。
初始化基类的唯一方法是在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
。
好的答案尼罗河。Python中的继承通常很混乱,但是你总结得很好。 – bsa