Articles of metaclase de

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

¿Qué tan diferente es el tipo .__ setattr__ del objeto .__ setattr__?

type.__setattr__ se usa para clases, básicamente instancias de metaclases. object.__setattr__ por otro lado, se usa para instancias de clases. Esto es totalmente entendido. No veo una diferencia significativa entre los dos métodos, al menos a nivel de Python, me doy cuenta de que los dos usan los mismos procedimientos para la asignación de atributos, corríjame […]

Resolviendo conflictos de metaclase

Necesito crear una clase que use una clase base diferente dependiendo de alguna condición. Con algunas clases me sale el infame: TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases Un ejemplo es sqlite3 , aquí hay un pequeño ejemplo que puede usar […]

Metaclases de Python: ¿Por qué no se llama a __setattr__ para establecer los atributos durante la definición de la clase?

Tengo el siguiente código de python: class FooMeta(type): def __setattr__(self, name, value): print name, value return super(FooMeta, self).__setattr__(name, value) class Foo(object): __metaclass__ = FooMeta FOO = 123 def a(self): pass Hubiera esperado que se __setattr__ de la meta clase tanto para FOO como para a . Sin embargo, no se llama en absoluto. Cuando asigno […]

El error al llamar a las bases de metaclase: función () el argumento 1 debe ser código, no str

Intenté subordenar subprocesos. Condición anterior hoy, pero no funcionó. Aquí está la salida del intérprete de Python cuando bash subclasificar la clase threading.Condition: >>> import threading >>> class ThisWontWork(threading.Condition): … pass … Traceback (most recent call last): File “”, line 1, in TypeError: Error when calling the metaclass bases function() argument 1 must be code, […]

¿Metaclass Mixin o encadenamiento?

¿Es posible encadenar metaclases? Tengo un Model clase que usa __metaclass__=ModelBase para procesar su __metaclass__=ModelBase de espacio de nombres. Voy a heredar de él y “enlazar” otra metaclase para que no oculte el original. El primer acercamiento es a la class MyModelBase(ModelBase) subclase class MyModelBase(ModelBase) : MyModel(Model): __metaclass__ = MyModelBase # inherits from `ModelBase` ¿Pero […]

¿Usando el método __call__ de una metaclase en lugar de __nuevo__?

Al discutir las metaclases, los documentos establecen: Por supuesto, también puede anular otros métodos de clase (o agregar nuevos métodos); por ejemplo, la definición de un método __call__() en la metaclase permite un comportamiento personalizado cuando se llama a la clase, por ejemplo, no siempre creando una nueva instancia. Mis preguntas son: supongamos que quiero […]