Quelles sont les principales différences entre les métaclasses Python et les décorateurs de classe? Y a-t-il quelque chose que je puisse faire avec l'un mais pas avec l'autre?Metaclasses Python vs décorateurs de classe
Répondre
Les décorateurs sont beaucoup, beaucoup plus simples et plus limités - et devraient donc être préférés chaque fois que l'effet désiré peut être atteint avec une 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 une métaclasse personnalisée (appliquez simplement la fonctionnalité de la "fonction décorateur", c'est-à-dire celle qui prend un objet de classe et le modifie) de la métaclasse __new__
ou __init__
qui fait 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 et applique une métaclasse personnalisée, bien sûr - mais c'est tricher; -) ... et même alors, dans Python 3, il y a des choses que vous ne pouvez faire qu'avec une métaclasse personnalisée, pas après coup ... mais c'est une sous-niche assez avancée de votre question, alors laissez-moi vous 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 pas le faire sans une métaclasse personnalisée, car le remplacement de la métaclasse __str__
est l'acteur crucial ici, c'est-à-dire que vous avez besoin d'un def __str__(cls): return "peekaboo!"
dans la métaclasse personnalisée de la classe X
. Il en va de même pour toutes les méthodes magiques, c'est-à-dire pour toutes les opérations appliquées à l'objet de classe lui-même (par opposition aux instances qui utilisent des méthodes magiques telles que définies dans la classe - les opérations sur l'objet de classe lui-même utilisent des méthodes magiques telles que définies dans la métaclasse).
- 1. Python: Metaclasses tout le chemin
- 2. Décorateurs de classe en Python 2.5?
- 3. Quel est l'analogue de Ruby pour les Metaclasses Python?
- 4. application décorateurs de python méthodes dans une classe
- 5. Décorateurs Python et méthodes de classe et évaluation - django memoize
- 6. Décorateurs appliqués à la définition de classe avec Python
- 7. Décorateurs et héritage Python
- 8. décorateurs et méthodes python
- 9. Décorateurs et dans la classe
- 10. Python: Très confus au sujet des décorateurs
- 11. Comment gérer l'argument « auto » avec décorateurs Python
- 12. Comment bande décorateurs d'une fonction en python
- 13. Utiliser des décorateurs python sur les méthodes de classe et les méthodes de sous-classes
- 14. Fonction Décorateurs
- 15. Les décorateurs Python sur les membres de la classe échouent lorsque le mécanisme de décorateur est une classe
- 16. Python classe réacteur torsadé
- 17. Décorateurs de coûts
- 18. Python 2.6.4 décorateurs de propriété ne fonctionne pas
- 19. Python - Y at-il une liste de décorateurs quelque part?
- 20. Décorateurs et méthodes virtuelles
- 21. méthode vs fonction vs procédure vs classe?
- 22. Zend Form, décorateurs de table
- 23. Utilisant des décorateurs sur des lambdas en Python?
- 24. Quelle est la différence entre l'utilisation de décorateurs et l'extension d'une sous-classe par héritage?
- 25. Ajout de fonctionnalités: sous-classe vs décorateur
- 26. wget Vs urlretrieve de python
- 27. Eclipse vs VS IDE Test d'une classe
- 28. win32api vs Python
- 29. Éléments de forme et décorateurs personnalisés Zend
- 30. Iron Python vs Razor
réponse intéressante d'éminent compatriote =) – gpilotino
Salut gino, toujours particulièrement heureux d'aider un compatriote bien sûr ;-). –
Eh bien .. ça fait 4 ans et j'ai trouvé cette question chez google. Je veux juste prendre note de votre exemple. J'ai défini un décorateur 'foo (cls)' qui a 2 instructions: 'cls .__ str__ = lambda self:" peekaboo! "' Et juste après cela 'return cls', et cela a fonctionné - j'ai réglé le' méthode __str__' d'une certaine classe avec le décorateur plutôt qu'avec une métaclasse compliquée .. Je voulais juste le noter, et peut-être obtenir un commentaire pour savoir si quelque chose me manque. – rboy