Pregunta

¿Cuáles son las principales diferencias entre metaclases Python y decoradores de clase? ¿Hay algo que pueda hacer con uno, pero no con la otra?

¿Fue útil?

Solución

decoradores son mucho, mucho más simple y más limitado -. Y por lo tanto debe preferirse siempre que el efecto deseado se puede lograr ya sea con una metaclase o un decorador clase

Todo lo que se puede hacer con un decorador de clase, se puede hacer, por supuesto, con una metaclase personalizado (sólo se aplica la funcionalidad de la "función decoradora", es decir, el que toma un objeto de clase y lo modifica, en el curso de __new__ de la metaclase o __init__ que hacen que el objeto de la clase -.)

Hay muchas cosas que puede hacer en una metaclase costumbre, pero no en un decorador (a menos que el decorador internamente genera y aplica una metaclase costumbre, por supuesto - pero eso es hacer trampa; -) ... e incluso entonces, en Python 3, hay cosas que sólo se puede hacer con una metaclase costumbre, no después del hecho ... pero eso es un sub-nicho bastante avanzada de su pregunta, así que vamos a dar ejemplos más simples de mí).

Por ejemplo, supongamos que desea hacer una X objeto de clase tal que print X (o en Python 3 print(X) por supuesto ;-) pantallas peekaboo!. No es posible hacerlo sin una metaclase costumbre, porque anulación de la metaclase de __str__ es el actor fundamental aquí, es decir, se necesita un def __str__(cls): return "peekaboo!" en la metaclase costumbre de X clase.

Lo mismo se aplica a todos los métodos de magia, es decir, a todo tipo de operaciones tal como se aplica a la propia objeto de clase (en contraposición a, los aplicados a su casos , que utilizan métodos mágicos como se define en la clase - las operaciones en el objeto de clase en sí utilizan métodos mágicos como se define en la metaclase)

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top