通过 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
我正在 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