Не вызываются ли функции __init__ класса Mixin автоматически?

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).

51
задан martineau 4 November 2016 в 07:03
поделиться