既然这个问题是关于继承和super,让我们从编写一个类开始。这是一个简单的日常类,代表一个人:
class Person:
def __init__(self, name):
super().__init__()
self.name = name
就像每个好的类都应该在初始化之前调用它的父构造函数一样。这个类做得很好;它可以毫无问题地使用:
>>> Person('Tom')
<__main__.Person object at 0x7f34eb54bf60>
但是当我尝试创建一个继承自两个Person类和另一个类的类时,事情突然出错了:
class Horse:
def __init__(self, fur_color):
super().__init__()
self.fur_color = fur_color
class Centaur(Person, Horse):
def __init__(self, name, fur_color):
# ??? now what?
super().__init__(name) # throws TypeError: __init__() missing 1 required positional argument: 'fur_color'
Person.__init__(self, name) # throws the same error
由于菱形继承(object类位于顶部),无法Centaur正确初始化实例。将super().__init__()在Person结束调用Horse.__init__,因为它抛出一个异常fur_color参数丢失。
但是如果Person并且Horse不调用super().__init__().
这就提出了一个问题:是否应该直接从objectcall继承的类super().__init__()?如果是,您将如何正确初始化Centaur?
相关分类