Articles of metaclase de

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

Inconsistencia de herencia múltiple de metaclase

Por qué es esto: class MyType(type): def __init__(cls, name, bases, attrs): print ‘created’, cls class MyMixin: __metaclass__ = MyType class MyList(list, MyMixin): pass bien, y funciona como se espera created created Pero esto: class MyType(type): def __init__(cls, name, bases, attrs): print ‘created’, cls class MyMixin: __metaclass__ = MyType class MyObject(object, MyMixin): pass ¿No está bien, […]

Python metaclass y la clase base de objeto

Después de leer la excelente publicación de SO , intenté crear una metaclase de nivel de módulo: def metaclass(future_class_name, future_class_parents, future_class_attrs): print “module.__metaclass__” future_class_attrs[“bar”]=”bar” return type(future_class_name, future_class_parents, future_class_attrs) __metaclass__=metaclass class Foo(object): def __init__(self): print ‘Foo.__init__’ f=Foo() Esto no funciona (es decir, “módulo. Metaclase ” no se imprime) a menos que elimine la clase base de […]

¿Cuáles son algunos casos de uso (concretos) para metaclases?

Tengo un amigo al que le gusta usar metaclases y regularmente los ofrece como una solución. Soy de la mente que casi nunca necesitas usar metaclases. ¿Por qué? porque me imagino que si estás haciendo algo así a una clase, probablemente deberías estar haciéndolo a un objeto. Y un pequeño rediseño / refactor está en […]

Marcador de posición personalizado como Ninguno en python

Estoy usando argspec en una función que toma otra función o método como argumento y devuelve una tupla como esta: ((“arg1”, obj1), (“arg2”, obj2), …) Esto significa que el primer argumento de la función pasada es arg1 y tiene un valor predeterminado de obj1, y así sucesivamente. Aquí está el problema : si no tiene […]