Question

Quelles sont les principales différences entre Python métaclasses et décorateurs de classe? Y at-il quelque chose que je peux faire avec un mais pas l'autre?

Était-ce utile?

La solution

Les décorateurs sont beaucoup, beaucoup plus simple et plus limitée -. Et devrait donc être à chaque fois que l'effet préféré souhaité peut être réalisé soit avec un métaclasse ou un décorateur de classe

Tout ce que vous pouvez faire avec un décorateur de classe, vous pouvez bien sûr faire avec un métaclasse personnalisé (il suffit d'appliquer la fonctionnalité de la fonction « décorateur », à savoir, celui qui prend un objet de classe et modifie, au cours de le __new__ du métaclasse ou __init__ qui font l'objet de classe -.)

Il y a beaucoup de choses que vous pouvez faire dans une métaclasse personnalisée, mais pas dans un décorateur (à moins que le décorateur génère en interne et applique une métaclasse personnalisée, bien sûr - mais ce triche; -) ... et même alors, en Python 3, il y a des choses que vous ne pouvez le faire avec une métaclasse personnalisée, pas après le fait ... mais c'est un sous-créneau assez avancée de votre question, alors laissez-moi donner des exemples plus simples).

Par exemple, supposons que vous voulez faire un objet de classe X telle que print X (ou en Python 3 print(X) bien sûr ;-) affiche peekaboo!. Vous ne pouvez peut le faire sans métaclasse personnalisée, parce que le remplacement de la métaclasse de __str__ est l'acteur essentiel ici, à savoir, vous avez besoin d'un def __str__(cls): return "peekaboo!" dans la métaclasse personnalisée de X de classe.

est de même pour toutes les méthodes magiques, à savoir, à toutes sortes d'opérations telles qu'elles sont appliquées à l'objet de classe elle-même (par opposition à, ceux appliqués à ses instances , qui utilisent des méthodes magiques telles que définies dans la classe -. opérations sur l'objet de classe elle-même utiliser des méthodes magiques tels que définis dans la métaclasse)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top