Je me demandais si j'ai deux modèles qui incluent tous deux des champs comme "meta_keywords" ou "slug" qui ont à voir avec la page web sur laquelle l'instance du modèle sera affichée, s'il serait judicieux de séparer ces éléments de métadonnées de page dans leur propre classe, disons PageMeta, et de faire en sorte que mes autres modèles les sous-classent via un héritage multiple ?
Réponse
Trop de publicités?Des conseils généraux pour une question peu précise :
L'héritage multiple non trivial en Python nécessite des techniques avancées pour gérer le conflit métaclasse/métatype. Regardez cette recette des archives d'ActiveState et voyez si cela ressemble au genre de choses que vous aimez :
Extrait de la recette liée :
Le cas le plus simple où un conflit de métatype se produit est le suivant. Considérons une classe A avec une métaclasse
M_A
et une classe B avec un métaclasseM_B
; supposons que nous dérivions C à partir de A et B. La question est la suivante : quelle est la métaclasse de C ? la métaclasse de C ? Est-elleM_A
oM_B
?La réponse correcte (voir le livre " Putting metaclasses to work " pour un discussion approfondie) est
M_C
,M_C
est une métaclasse qui hérite deM_A
yM_B
.Cependant, Python n'est pas si magique, et il ne crée pas automatiquement
M_C
. Au lieu de cela, elle soulève une TypeError, avertissant le programmeur de la possible confusion.
Par conséquent, je recommande de limiter votre utilisation de l'héritage multiple en Python aux cas suivants :
- Vous devez le faire, car votre problème vous oblige à combiner deux bibliothèques à héritage unique maintenues séparément.
- Vous avez atteint une telle aisance avec le métatype et la métaclasse que vous pouvez écrire recette 204197 ou son équivalent aussi facilement et en toute confiance que vous pouvez écrire une déclaration d'impression.
Edita:
Voici Guido van Rossum dans Une introduction à Python :
Il est clair que l'utilisation indiscriminée de d'héritages multiples cauchemar de la maintenance, étant donné la dépendance de Python sur les conventions pour éviter les conflits de noms accidentels.
Le voici à nouveau dans PEP 253 qui décrit les idées qui ont été incorporées dans Python, mais pas l'implémentation :
Les métatypes déterminent divers politiques f ce qui se passe quand un type est appelé, comment les types sont dynamiques (si un type dict peut être modifié après avoir été l'ordre de résolution des méthodes, comment les attributs d'instance sont recherchés et ainsi de suite.
Je soutiendrai que de gauche à droite solution lorsque l'on veut tirer le meilleur parti de l'héritage multiple. l'héritage.
Je soutiendrai qu'avec de multiples dans sous-type doit être un descendant des métatypes de tous les types de base.
Cela ne no ne signifie pas que vous ne devez pas utiliser l'héritage multiple ; je vous préviens simplement pour que vous ne soyez pas surpris un jour de vous retrouver à vous frapper le front en vous exclamant "D'oh ! Le métatype d'un de mes sous-types n'est pas un descendant des métatypes de tous ses types de base ! Ne détestez-vous pas quand cela se produit ? ".