Sont Mixin classe de __init__ fonctions qui ne sont pas automatiquement appelé?

Je voudrais utiliser un Mixin de toujours ajouter quelques init fonctionnalité à mon enfant des classes qui chaque hériter de différentes API des classes de base. Plus précisément, je voudrais faire plusieurs enfants des classes qui héritent de l'un de ces différentes API fourni par les classes de base et l'un Mixin, qui aura toujours le Mixin code d'initialisation exécutée de la même manière, sans code de la réplication. Cependant, il semble que le __init__ de la fonction de la classe Mixin n'est jamais appelé, sauf si j'ai choisi de l'appeler dans l'Enfant de la classe de __init__ de la fonction, ce qui est loin d'être idéale. J'ai fait un test simple cas:

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

Comme vous pouvez le voir dans la sortie suivante, le Mixin de la fonction init n'est jamais appelé:

>>> import test
>>> test.MixedClass()
 base
<test.MixedClass object at 0x1004cc850>

Est-il un moyen de le faire (avoir une fonction init dans un Mixin appelée), sans écrire de chaque enfant de la classe pour appeler explicitement le Mixin de la fonction init? (c'est à dire, sans avoir à faire quelque chose de ce genre dans chaque classe:)

class MixedClass(MyClass, SomeMixin):
    def __init__(*args, **kwargs):
        SomeMixin.__init__(self, *args, **kwargs)
        MyClass.__init__(self, *args, **kwargs) 

Btw, si tous mes enfants les classes héritant de la même classe de base, je me rends compte que je pouvais créer une nouvelle classe moyenne, qui hérite de la classe de base et le mixin et le garder au SEC de cette façon. Cependant, ils héritent de différentes classes de base avec des fonctionnalités communes. (Django Champ classes, pour être précis).

  • En général, l'utilisation de l'héritage multiple avec des classes de base qui n'étaient pas conçues pour cela est une mauvaise idée. Mélanger les classes sont généralement conçus ensemble, et de mélange arbitraire des classes de produit de tels dégâts. En tout cas, si les deux classes de base ont chacun une __init__ méthode, comment l'interprète de savoir qui de l'un à l'appel, ou l'ordre dans lequel les appeler?
  • Caron: Il est possible de déterminer l'ordre comme le C++ n', où les classes de base sont initialisés dans l'ordre de déclaration.
InformationsquelleAutor Ben Roberts | 2011-05-23