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