我想使用Mixin为我的子类添加一些初始化功能,这些子类都继承自不同的API基类。具体来说,我想创建多个不同的子类,它们都继承自API提供的不同基类之一,以及一个Mixin,该Mixin始终以相同的方式执行Mixin初始化代码,而无需复制代码。但是,似乎Mixin类的__init__函数永远不会被调用,除非我在子类的__init__函数中显式调用它,这不太理想。我已经建立了一个简单的测试案例:
class APIBaseClassOne(object):
def __init__(self, *args, **kwargs):
print (" base ")
class SomeMixin(object):
def __init__(self, *args, **kwargs):
print (" mixin before ")
super(SomeMixin, self).__init__(*args, **kwargs)
print (" mixin after ")
class MyClass(APIBaseClassOne):
pass
class MixedClass(MyClass, SomeMixin):
pass
如下输出所示,Mixin函数的init从未被调用:
>>> import test
>>> test.MixedClass()
base
<test.MixedClass object at 0x1004cc850>
有没有一种方法可以让一个Mixin中的初始化函数被调用,而不需要显式地在每个子类中调用它?(也就是说,不需要在每个类中都像这样做:)
class MixedClass(MyClass, SomeMixin):
def __init__(*args, **kwargs):
SomeMixin.__init__(self, *args, **kwargs)
MyClass.__init__(self, *args, **kwargs)
顺便说一句,如果我所有的子类都从同一个基类继承,我意识到我可以创建一个新的中间类,该类从基类和混合类中继承,并以此方式保持DRY。然而,它们从具有共同功能的不同基类继承(确切地说是Django字段类)。
__init__
方法,解释器应该如何知道调用哪一个或以什么顺序调用它们呢? - André Caron