多重继承中无用的超级? [复制]

Posted

技术标签:

【中文标题】多重继承中无用的超级? [复制]【英文标题】:useless super in multiple inheritance? [duplicate] 【发布时间】:2015-12-24 16:14:32 【问题描述】:

在多重继承中 super() 是如何工作的? 例如这里我有两个 init 我想通过 super() 发送参数:

class LivingThings(object):
    def __init__(self, age ,name):
        self.name=name
        self.age=age

    def Print(self):
        print('age: ', self.age)
        print('name: ', self.name)

class Shape(object):
    def __init__(self, shape):
        self.shape=shape
    def Print(self):
        print(self.shape)

class Dog(LivingThings, Shape):
    def __init__(self, breed, age , name, shape):
        self.breed=breed
        super().__init__(age , name)
        super().__init__(shape)


    def Print(self):
        LivingThings.Print(self)
        Shape.Print(self)
        print('breed', self.breed)

但错误:

super().__init__(shape)
TypeError: __init__() missing 1 required positional argument: 'name'

但此代码有效:

class Dog(LivingThings, Shape):
    def __init__(self, breed, age , name, shape):
        self.breed=breed
        Shape.__init__(self, shape)
        LivingThings.__init__(self,age ,name)

所以 super() 在多重继承中不起作用??

【问题讨论】:

如果你正确地实现它会这样——两个超类都没有使用super,所以只有第一个被调用,它们有不同的签名。 除了向那些 __init__ 方法添加适当的 super() 调用外,您还需要更改它们,使它们都具有相同的调用签名。简单的方法是使用关键字 args 的字典,如 Daniel Roseman 链接的 Raymond Hettinger 文章中的 ColoredShape 示例所示。 【参考方案1】:

super 在多重继承中工作正常;事实上,这正是它的用途。但是由于某种原因,您使用不同的论点两次调用它;这不是它的工作原理。

调用一次。这将调用方法解析顺序中的下一个方法。然后该方法负责调用super,调用下一个方法。

请阅读 Raymond Hettinger 的经典文章Super considered super。

【讨论】:

那么两个父类型之间的超构造函数关系是什么? 对不起,我完全不明白这个问题。什么关系? Raymond Hettinger 在 Pycon 2015 上也做了一个有趣的演讲:youtube.com/watch?v=EiOglTERPEo 方法解析顺序需要..排序。 @user2864740 是的,可以在__mro__ 属性中看到

以上是关于多重继承中无用的超级? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python中的多重继承与超级[重复]

Java 8 是不是支持多重继承? [复制]

Extjs 多重继承?

为什么像Java,C#和VB.NET现代面向对象的语言不支持多重继承[复制]

多重继承,虚基类

什么是多重继承,单重继承?