Siguiendo this answer parece que una clase clase metaclase puede ser cambiado después se ha definido la clase utilizando el siguiente *:El establecimiento de un metaclase usando un decorador
class MyMetaClass(type):
# Metaclass magic...
class A(object):
pass
A = MyMetaClass(A.__name__, A.__bases__, dict(A.__dict__))
Definir una función
def metaclass_wrapper(cls):
return MyMetaClass(cls.__name__, cls.__bases__, dict(cls.__dict__))
me permite aplicar un decorador de una definición de clase como tal,
@metaclass_wrapper
class B(object):
pass
vER ms que la magia de la metaclase se aplica a B
, sin embargo, B
no tiene ningún atributo __metaclass__
. Es el método anterior de una manera sensata para aplicar metaclases a las definiciones de clase, a pesar de que estoy definiting y re-definiting una clase, o ¿sería mejor simplemente escribiendo
class B(object):
__metaclass__ = MyMetaClass
pass
supongo que hay algunas diferencias entre los dos métodos.
* Nota, la respuesta original en la cuestión vinculada, MyMetaClass(A.__name__, A.__bases__, A.__dict__)
, devuelve un TypeError
:
TypeError: type() argument 3 must be a dict, not dict_proxy
Parece que el atributo __dict__
de A
(la definición de clase) tiene un tipo dict_proxy
, mientras el tipo del atributo __dict__
de una instancia de A
tiene un tipo dict
. ¿Por qué es esto? ¿Es esto una diferencia de Python 2.x vs. 3.x?
Me preguntaba si había un decorador equivalente a establecer el atributo '__metaclass__' en una definición de clase. Supongo que otra parte de mi pregunta es que mi "decorador" * pareció * funcionar, pero noté que la clase decorada no tiene el atributo '__metaclass__', por lo que claramente hay una diferencia entre los dos métodos; ¿Por qué es esto? – Chris