为什么python子类不必提供父参数?

时间:2019-07-23 10:34:20

标签: python inheritance parameters

我不理解如何在不将(必需的)必需参数传递给父类的情况下初始化子类。

此代码基于考试中的问题。我尝试了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)行会引发异常,因为子构造函数不会将参数传递给父构造函数。如果没有此参数,则无法构造父级。

编辑:这里有一些评论说孩子在初始化期间从不调用父对象,我想了解更多有关这的信息,因为我习惯于在初始化子对象时初始化父对象的想法。因此,如果有人可以将我转至其说明的地方,这将回答我的问题。似乎无法独自找到它。

1 个答案:

答案 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