通过 super() 覆盖构造函数,提供父构造函数所需的更少参数

Overriding a constructor via super() providing fewer parameters that the parent constructor requires

我正在 Python 阅读这篇 tutorial about inheritance。它提出了以下示例(我将其简化了一点):

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name            

class Trout(Fish):
    def __init__(self, water = "freshwater"):
        self.water = water
        super().__init__(self)

(对我来说)令人惊讶的是,您可以创建 Trout 的实例而不给它任何名称并且它不会引发异常。我不明白为什么调用 super().__init__(self) 不会失败。父class的构造函数需要first_name参数!为什么你不能在不给它一个名字的情况下创建一个 Fish 的实例(即 Fish() 失败),但是你可以毫无问题地从子 class 调用相同的构造函数(即 Trout() 作品)!?

提出这个疑问的另一种方式是说我希望实现子 class 的唯一正确方法是:

class Trout(Fish):
    def __init__(self, first_name, water = "freshwater"):
        self.water = water
        super().__init__(self, first_name)

您已将 self 作为第一个参数传递给 super().__init__。查看 Trout 实例的 first_name,您将得到 <__main__.Trout object at 0x7f93635e8130>(具有不同的内存地址)- self 隐含在方法调用中,因此明确传递 self它是第一个参数。

编辑添加(因为这不是很清楚,我意识到): 你的例子的正确形式看起来像

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name            

class Trout(Fish):
    def __init__(self, first_name, water = "freshwater"):
        self.water = water
        super().__init__(first_name) # note that self is not required here