Articles of metaclass

¿Cómo pasar argumentos a la metaclase de la definición de clase?

Estoy tratando de generar clases dinámicamente en Python 2.7, y me pregunto si puede pasar fácilmente argumentos a la metaclase desde el objeto de clase. He leído esta publicación, que es increíble, pero no responde la pregunta. en el momento estoy haciendo: def class_factory(args, to, meta_class): Class MyMetaClass(type): def __new__(cls, class_name, parents, attrs): attrs[‘args’] = […]

¿Por qué debería usar el método __prepare__ para obtener el espacio de nombres de una clase?

Nota Esta pregunta no es sobre el tipo de datos de Python 3 Enum , es solo el ejemplo que estoy usando. Con PEP 3115, Python 3 agregó el método __prepare__ 1 al type con el fin de permitir que se use un espacio de nombres personalizado al crear clases. Por ejemplo, el nuevo tipo […]

Cómo registrar automáticamente una clase cuando está definida

Quiero tener una instancia de clase registrada cuando se define la clase. Lo ideal sería que el siguiente código hiciera el truco. registry = {} def register( cls ): registry[cls.__name__] = cls() #problem here return cls @register class MyClass( Base ): def __init__(self): super( MyClass, self ).__init__() Desafortunadamente, este código genera el error NameError: global […]

¿Cómo pasar argumentos a la metaclase de la definición de clase en Python 3.x?

¿Esta es una versión de Python 3.x de Cómo pasar argumentos a la metaclase de la definición de clase? pregunta, enumerada por separado por solicitud ya que la respuesta es significativamente diferente de Python 2.x. En Python 3.x, ¿cómo paso los argumentos a las __prepare__ , __new__ y __init__ una metaclase para que un autor […]

Interceptar la búsqueda del operador en metaclase

Tengo una clase que necesita hacer algo de magia con cada operador, como __add__ , __sub__ y así sucesivamente. En lugar de crear cada función en la clase, tengo una metaclase que define a cada operador en el módulo del operador. import operator class MetaFuncBuilder(type): def __init__(self, *args, **kw): super().__init__(*args, **kw) attr = ‘__{0}{1}__’ for […]

Registrar automáticamente los métodos de clase utilizando el decorador.

Quiero poder crear un decorador de Python que automáticamente “registre” los métodos de clase en un repository global (con algunas propiedades). Código de ejemplo: class my_class(object): @register(prop1,prop2) def my_method( arg1,arg2 ): # method code here… @register(prop3,prop4) def my_other_method( arg1,arg2 ): # method code here… Quiero que cuando se complete la carga, en algún lugar habrá […]

Establecer automáticamente el valor de un miembro enum a su nombre

He estado jugando con la biblioteca de enumeración de python y he encontrado un enigma. En los documentos, muestran un ejemplo de una enumeración de numeración automática , en la que se define algo: class Color(AutoNumber): red = () green = () … Quiero hacer una clase similar, pero el valor se establecería automáticamente a […]

nose, unittest.TestCase y metaclass: métodos de test_ * generados automáticamente no descubiertos

Esta es una pregunta de seguimiento para unittest y metaclass: generación automática del método test_ * : Para este (unitario) unittest.TestCase layout: #!/usr/bin/env python import unittest class TestMaker(type): def __new__(cls, name, bases, attrs): callables = dict([ (meth_name, meth) for (meth_name, meth) in attrs.items() if meth_name.startswith(‘_test’) ]) for meth_name, meth in callables.items(): assert callable(meth) _, _, […]

Agregar una clase base a un objeto existente en Python

Tengo varios objetos de diferentes tipos (diferentes nombres de funciones, diferentes firmas) y los parcheo para tener una forma común de acceder a ellos desde diferentes funciones. Brevemente, hay un distribuidor que toma los objetos que quiero parchear y, según el tipo de objeto, llama a un parcheador diferente. Un parche agregará métodos al objeto: […]

__instancecheck__ – sobrescribir no muestra ningún efecto, ¿qué estoy haciendo mal?

Estoy tratando de hacer que mi clase aparezca como un objeto diferente para evitar la comprobación de tipos perezosos en un paquete que estoy usando. Más específicamente, estoy tratando de hacer que mi objeto aparezca como una instancia de otro objeto ( tuple en mi caso) cuando en realidad ni siquiera es una derivación de […]