Articles of metaclase de

¿El tipo predeterminado .__ call__ hace más que llamar __new__ y __init__?

Estoy escribiendo una metaclase y quiero que se llame un método adicional entre __new__ y __init__. Si estuviera llamando al método antes de __nuevo__ o después de __init__ podría escribir, por ejemplo class Meta(type): def __call__(cls): ret = type.__call__() ret.extraMethod() Mi tentacion es escribir class Meta(type): def __call__(cls): ret = cls.__new__(cls) ret.extraMethod() ret.__init__() return ret […]

unittest y metaclase: prueba automática * generación de método

Cuando creo pruebas para un marco, empiezo a notar el siguiente patrón: class SomeTestCase(unittest.TestCase): def test_feat_true(self): _test_feat(self, True) def test_feat_false(self): _test_feat(self, False) def _test_feat(self, arg): pass # test logic goes here Así que quiero crear test_feat_* progtwigción métodos de test_feat_* para este tipo de clases de prueba con una metaclase. En otras palabras, para cada […]

¿Relación entre “__call__” de metaclase y “__init__” de la instancia?

Digamos que tengo una metaclase y una clase que lo usa: class Meta(type): def __call__(cls, *args): print “Meta: __call__ with”, args class ProductClass(object): __metaclass__ = Meta def __init__(self, *args): print “ProductClass: __init__ with”, args p = ProductClass(1) Salida de la siguiente manera: Meta: __call__ with (1,) Pregunta: ¿Por qué no se ProductClass.__init__ … solo por […]

Añadiendo métodos dinámicamente con o sin metaclase.

Actualización – 2012/12/13 Solo para aclarar, no me interesa tanto cómo agregar métodos a las clases, como puede ver a continuación en mi pregunta y en las respuestas de las personas, hay más de una manera de hacerlo (lengua en la mejilla y punta de sombrero para mi propio Perl). Lo que me interesa es […]

¿Cuándo a las definiciones en línea de metaclase en Python?

Hoy me he topado con una sorprendente definición de metaclase en Python aquí , con la definición de metaclase efectivamente incorporada. La parte relevante es class Plugin(object): class __metaclass__(type): def __init__(cls, name, bases, dict): type.__init__(name, bases, dict) registry.append((name, cls)) ¿Cuándo tiene sentido usar tal definición en línea? Otros argumentos: Un argumento de una forma sería […]

Python: Modificar los argumentos pasados ​​antes de la inicialización de la instancia de clase

Estoy experimentando con formas de implementar un sistema simplificado de reescritura de términos (TRS) / sistema de álgebra simbólica en Python. Para esto realmente me gustaría poder interceptar y modificar los operandos en casos particulares durante el proceso de creación de instancias de instancia de clase. La solución que se me ocurrió fue crear una […]

¿Cuál es la diferencia entre tipo y tipo .__ nuevo__ en python?

Estaba escribiendo una metaclase y accidentalmente lo hice así: class MetaCls(type): def __new__(cls, name, bases, dict): return type(name, bases, dict) … en lugar de esto class MetaCls(type): def __new__(cls, name, bases, dict): return type.__new__(cls, name, bases, dict) ¿Cuál es exactamente la diferencia entre estas dos metaclases? Y más específicamente, ¿qué causó que la primera no […]

¿Cómo obtener atributos en el orden en que se declaran en una clase de Python?

Como se describe en PEP435 , una enum se puede definir de esta manera: class Color(Enum): red = 1 green = 2 blue = 3 Y los enum members de enum members resultantes de Color se pueden iterar en el orden de definición: Color.red, Color.green, Color.blue . Esto me recuerda a Form en Django , […]

¿De costumbre heredar metaclases de tipo?

He estado tratando de entender las metaclases de Python, y así he estado revisando un código de ejemplo. Por lo que yo entiendo, una metaclase Python puede ser invocable. Entonces, puedo tener mi metaclase como def metacls(clsName, bases, atts): …. return type(clsName, bases, atts) Sin embargo, he visto a muchas personas escribir sus metaclases de […]

Python: las propiedades de metaclase anulan los atributos de clase, a veces?

El resultado del siguiente código me desconcierta: class MyClass(type): @property def a(self): return 1 class MyObject(object): __metaclass__ = MyClass a = 2 print MyObject.a print object.__getattribute__(MyObject, ‘a’) print type.__getattribute__(MyObject, ‘a’) print MyObject.__dict__[‘a’] print MyObject().a Realmente espero que esto solo imprima 2 repetidamente, pero imprime 1 1 1 2 2 . ¿Hay alguna manera de que […]