我不理解如何在不将(必需的)必需参数传递给父类的情况下初始化子类。
此代码基于考试中的问题。我尝试了python 3.4.7的Classes文档,却没有找到答案或通过谷歌搜索找到答案。
>>> class parent:
def __init__(self, param):
self.v1 = param
>>> class child(parent):
def __init__(self, param):
self.v2 = param
>>> obj = child(11)
>>> print(obj.v2)
11
>>> obj = parent()
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
obj = parent()
TypeError: __init__() missing 1 required positional argument: 'param'
>>>
我希望第obj = child(11)
行会引发异常,因为子构造函数不会将参数传递给父构造函数。如果没有此参数,则无法构造父级。
编辑:这里有一些评论说孩子在初始化期间从不调用父对象,我想了解更多有关这的信息,因为我习惯于在初始化子对象时初始化父对象的想法。因此,如果有人可以将我转至其说明的地方,这将回答我的问题。似乎无法独自找到它。
答案 0 :(得分:1)
默认情况下,派生类中的方法覆盖其父类中的相应方法。因此,在调用child.__init__
时,不会调用parent.__init__
。
在这种情况下,程序员有责任确保child.__init__
正确初始化实例。
如果还必须执行parent.__init__
,则必须显式调用它。
class Child(Parent):
def __init__(self, param):
self.v2 = param
super().__init__()
如果超类的__init__
方法需要参数,则必须通过super
提供参数:
class Child(Parent):
def __init__(self, param1, param2):
self.v2 = param2
super().__init__(param1)
可以直接调用父方法,而不是通过super
来调用:
class Child(Parent):
def __init__(self, param1, param2):
self.v2 = param2
Parent.__init__(param1)
但是super
可以更好地处理复杂的继承图,因此程序员经常使用super
来避免以后不得不更改代码。
Raymond Hettinger的文章Super Considered Super详细讨论了super
。