Ce n'est pas une coutume métaclasse problème (même si elle est diagnostiquée à métaclasse stade):
>>> class Normal(object): pass
...
>>> class MyObject(object, Normal): pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases object, Normal
et le problème est le même que celui-ci:
>>> class Derived(Normal): pass
...
>>> class Ok(Derived, Normal): pass
...
>>> class Nope(Normal, Derived): pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases Normal, Derived
c'est à dire, ne peut pas se multiplier hériter d'une classe de base suivie par une classe dérivée-il est impossible de définir une constante MRO qui satisfait à l'habitude MRO contraintes/garanties.
Heureusement, vous n'avez pas envie de le faire -- la sous-classe, vraisemblablement, les remplacements d'une méthode de la classe de base (c'est ce normal sous-classes n';-), et d'avoir la classe de base "en face" signifierait "de l'ombre à la remplacer".
Mettre la classe de base après la dérivée est assez inutile, mais au moins il est inoffensif (et conforme à la normale MRO garanties).
Votre premier exemple de cours fonctionne parce qu' MyMixin
est pas dérivé d' list
:
>>> MyMixin.__mro__
(<class '__main__.MyMixin'>, <type 'object'>)
...mais il est dérivé d' object
(comme à chaque style moderne Python classe), de sorte que le deuxième exemple, on ne peut pas travailler (tout à fait indépendamment de l' MyMixin
ayant une coutume métaclasse).