猿问

直接从`object`继承时,我应该调用super().__init__()吗?

既然这个问题是关于继承和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?


PIPIONE
浏览 193回答 3
3回答
随时随地看视频慕课网APP

相关分类

Python
我要回答