多重继承中无用的超级? [复制]
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__
属性中看到以上是关于多重继承中无用的超级? [复制]的主要内容,如果未能解决你的问题,请参考以下文章