Articles of metaclase de

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 […]

¿Cuál es la forma correcta de implementar una metaclase con una firma diferente a `type`?

Digamos que quiero implementar una metaclase que debería servir como una fábrica de clases. Pero a diferencia del constructor de type , que toma 3 argumentos, mi metaclase debería ser invocable sin ningún argumento: Cls1 = MyMeta() Cls2 = MyMeta() … Para este propósito, __new__ método __new__ personalizado sin parámetros: class MyMeta(type): def __new__(cls): return […]

¿Por qué los procedimientos de búsqueda para obtener un atributo de una clase y de una instancia son diferentes?

Python en pocas palabras describe los procedimientos de búsqueda al obtener un atributo. El libro distingue dos casos. el procedimiento de búsqueda al obtener un atributo de una clase, por ejemplo, cls.name Obtener un atributo de una clase Cuando utiliza la syntax C.name para referirse a un atributo en un objeto de clase C , […]

Anulación de la metaclase base __new__ genera clases con un __module__ incorrecto

Encontré un comportamiento extraño con cpython 2.5, 2.7, 3.2 y pypy con metaclass que anulan __new__ cuando __new__ la forma compatible con python 2 / python 3 de usar metaclass: Dado un módulo m1: class C1Meta(type): def __new__(cls, name, bases, dct): return type.__new__(cls, name, bases, dct) C1 = C1Meta(‘C1’, (object,), {}) class C2Meta(type): pass C2 […]