¿Cuáles son las principales diferencias entre las metaclases de Python y los decoradores de clases? ¿Hay algo que pueda hacer con una pero no con la otra?Python metaclasses vs class decorators
Respuesta
Los decoradores son mucho, mucho más simples y más limitados, y por lo tanto deben preferirse siempre que el efecto deseado se pueda lograr con una metaclass o un decorador de clase.
Cualquier cosa que pueda hacer con un decorador de clases, puede hacerlo con una metaclass personalizada (solo aplique la funcionalidad de la "función decoradora", es decir, la que toma un objeto de clase y lo modifica, en el curso de la metaclass __new__
o __init__
que hacen que el objeto de clase! -).
Hay muchas cosas que puede hacer en una metaclass personalizada pero no en un decorador (a menos que el decorador genere internamente y aplique una metaclase personalizada, por supuesto, pero eso es hacer trampa; -) ... e incluso entonces, en Python 3, hay cosas que solo puedes hacer con una metaclase personalizada, no después del hecho ... pero ese es un sub-nicho muy avanzado de tu pregunta, así que déjame dar ejemplos más simples).
Por ejemplo, supongamos que desea hacer un objeto de clase X
tal que print X
(o en Python 3 print(X)
por supuesto ;-) muestra peekaboo!
. No puede hacer eso sin una metaclass personalizada, porque la anulación de la metaclase de __str__
es el actor crucial aquí, es decir, necesita un def __str__(cls): return "peekaboo!"
en la metaclase personalizada de la clase X
.
Lo mismo se aplica a todos los métodos mágicos, es decir, a todo tipo de operaciones aplicadas al objeto de clase en sí (a diferencia de, aplicadas a sus instancias , que utilizan métodos mágicos como se define en la clase - las operaciones en el objeto de clase en sí usan métodos mágicos como se define en la metaclase).
- 1. Python Decorators and inheritance
- 2. Python: Metaclasses hasta el final
- 3. scala: analogy to metaclasses in python?
- 4. Metaclasses y __slots__?
- 5. ASP.NET Cache class vs. MemoryCache class
- 6. ¿Para qué sirven las metaclases de Python?
- 7. Zend Framework Checkbox Decorators
- 8. .class vs .java
- 9. @class vs # import
- 10. JavaScript decorators HOWTO?
- 11. Ruby: initialize() vs class body?
- 12. Java Utility Class vs. Service
- 13. Python Class Decorator
- 14. CSS: #id .class VS .class performance. ¿Cual es mejor?
- 15. Zend File Upload y Element Decorators
- 16. Solution Explorer vs Solution Navigator vs Class View
- 17. Métodos de extensión vs Static Utility Class
- 18. ActiveRecord Rails 3 scope vs class method
- 19. Zend_Framework Decorators Wrap Label y ViewHelper dentro de un div
- 20. Python List Class __contains__ Método Funcionalidad
- 21. Cuándo usar class versus dict en python?
- 22. Alcance y listas de Python Class
- 23. descriptor Python vs propiedad
- 24. Boo vs C# vs Python?
- 25. Python: repr vs backquote
- 26. Struct vs Class para objetos de larga vida
- 27. IEnumerable vs List in the Response Class, ServiceStack
- 28. Ruby Class Métodos vs. Métodos en clases propias
- 29. ¿Inyectar Util Class con Google Guice vs static Methods?
- 30. python 2.7 vs python 3.1
respuesta interesante de eminent fellow countryman =) – gpilotino
Hola gino, siempre especialmente contento de ayudar a un compatriota, por supuesto ;-). –
Bueno ... han pasado 4 años y encontré esta pregunta en google. Solo quiero hacer una nota sobre tu ejemplo. He definido un decorador 'foo (cls)' que tiene 2 enunciados: 'cls .__ str__ = lambda self:" peekaboo! "' Y justo después de eso 'return cls', y realmente funcionó - He configurado' __str__' método de alguna clase con el decorador en lugar de una metaclass complicada ... Solo quería notar esto, y tal vez obtener algún comentario para saber si me estoy perdiendo algo. – rboy