假设我有一个基类Person
和两个派生类Footballer
和Musician
。
显然,一个人既可以是足球运动员又可以是音乐家,所以也许我想要一个叫做FootballerAndMusician
的第三个类,但这个类将只是两个其他类的组合(将有而不是冲突:两个派生类只覆盖一些特定的东西,Musician
中没有覆盖Footballer
中覆盖的东西,反之亦然)。
在Python中实现这种模式的适当方法是什么,以避免在第三个类中重复两个派生类中的代码(想象一下,如果我必须对几个类这样做……)?
基本上,我想实现许多Person
的派生类,然后只要不存在冲突,就可以轻松地将它们组合起来。
在Python中是如何设计的?
这叫做多重继承,在Python中是这样的
class FootballerAndMusician(Footballer, Musician):
# your specific class code goes here, like
现在这个类可以访问两个超类的所有方法了。
查找方法的顺序有一些微妙的复杂性。在这个简单的例子中,只是从"左"到"右"。因此,如果Footballer
和Musician
都有一个名为play
的方法,那么在上面的示例中,FootballerAndMusician
将使用Footballer
版本。
注意,多重继承会很快变得复杂和混乱,所以您应该谨慎使用它。如果只是为了创建一些大的"分类",我建议避免使用。
这很简单:
class FootballerAndMusician(Footballer, Musician):
pass
当然,这假设Footballer
和Musician
(以及Person
)都被正确地设计为允许多重继承。请参阅https://rhettinger.wordpress.com/2011/05/26/super-considered-super/获取正确使用super
的建议。
多重继承才是你想要的。
Class Base1:
(body_1)
Class Base2:
(body_2)
Class Derived(Base1, Base2):
(body_3)
只要你的基类Footballer
和Musician
不干扰对方的方法,你就可以去了。
另外,如果需要显式地使用构造函数,
Class Derived(Base1, Base2):
def __init__(self, args):
super(Derived, self).__init__(args)