Python组合派生类到相同的基类?



假设我有一个基类Person和两个派生类FootballerMusician

显然,一个人既可以是足球运动员又可以是音乐家,所以也许我想要一个叫做FootballerAndMusician的第三个类,但这个类将只是两个其他类的组合(将有而不是冲突:两个派生类只覆盖一些特定的东西,Musician中没有覆盖Footballer中覆盖的东西,反之亦然)。

在Python中实现这种模式的适当方法是什么,以避免在第三个类中重复两个派生类中的代码(想象一下,如果我必须对几个类这样做……)?

基本上,我想实现许多Person的派生类,然后只要不存在冲突,就可以轻松地将它们组合起来。

在Python中是如何设计的?

这叫做多重继承,在Python中是这样的

class FootballerAndMusician(Footballer, Musician):
# your specific class code goes here, like

现在这个类可以访问两个超类的所有方法了。

查找方法的顺序有一些微妙的复杂性。在这个简单的例子中,只是从"左"到"右"。因此,如果FootballerMusician都有一个名为play的方法,那么在上面的示例中,FootballerAndMusician将使用Footballer版本。

注意,多重继承会很快变得复杂和混乱,所以您应该谨慎使用它。如果只是为了创建一些大的"分类",我建议避免使用

这很简单:

class FootballerAndMusician(Footballer, Musician):
pass
当然,这假设FootballerMusician(以及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)

只要你的基类FootballerMusician不干扰对方的方法,你就可以去了。
另外,如果需要显式地使用构造函数,

Class Derived(Base1, Base2):
def __init__(self, args):
super(Derived, self).__init__(args)

最新更新