Я хотел бы использовать Mixin, чтобы всегда добавлять некоторые функции init к моим дочерним классам, каждый из которых наследуется от разных базовых классов API. В частности, я хотел бы создать несколько разных дочерних классов, которые наследуют один из этих базовых классов, поставляемых API, и один Mixin, который всегда будет иметь код инициализации Mixin, выполненный таким же образом, без репликации кода. Тем не менее, кажется, что функция __init__ класса Mixin никогда не вызывается, если я явно не назову ее в функции класса __init__ класса Child, которая является менее идеальной. Я создал простой тестовый пример:
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 никогда не вызывается:
>>> import test
>>> test.MixedClass()
base
<test.MixedClass object at 0x1004cc850>
Есть ли способ сделать это (иметь функцию init в вызове Mixin), не записывая каждый дочерний класс для явного вызова функции инициализации Mixin? (т.е. без необходимости делать что-то подобное в каждом классе:)
class MixedClass(MyClass, SomeMixin):
def __init__(*args, **kwargs):
SomeMixin.__init__(self, *args, **kwargs)
MyClass.__init__(self, *args, **kwargs)
Btw, если все мои дочерние классы наследовались от одного базового класса, я понимаю, что могу создать новый средний класс, который наследуется от базового класса и mixin и держит его DRY таким образом. Однако они наследуются от разных базовых классов с общей функциональностью. (Классы Django Field, если быть точным).