Articles of metaclass

implementar singleton con metaclase

El código a continuación es cómo implemento Singleton con metaclass, y funciona bien. class Test_MetaClass(type): def __init__(cls, name, bases, dict): super(Test_MetaClass, cls).__init__(cls, bases, dict) cls._instance = None print ‘Test_MetaClass __init__’ def __call__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(Test_MetaClass, cls).__call__(*args, **kwargs) print ‘Test_MetaClass __call__’ return cls._instance class A(object): __metaclass__ = Test_MetaClass def __init__(self): […]

Cuerpo del método abstracto en Python 3.5

Tengo una clase abstracta, Model , con algunos métodos abstractos, ¿qué debo poner en el cuerpo de los métodos? Un retorno class Model(metaclass=ABCMeta): @abstractmethod def foo(self): return Un pase class Model(metaclass=ABCMeta): @abstractmethod def foo(self): pass Planteando un error descriptivo. class Model(metaclass=ABCMeta): @abstractmethod def foo(self): raise NotImplementedError(“Class {class_name} doesn’t implement {func_name} function” .format(class_name=self.__class__.__name__, func_name=self.foo.__name__)) Normalmente, implementaría […]

SqlAlchemy metaclass confusion

Estoy tratando de inyectar algo de mi propio código en el proceso de construcción de clase de SqlAlchemy. Tratando de entender el código, estoy algo confundido por la implementación de la metaclase. Aquí están los fragmentos relevantes: La “metaclase” predeterminada de SqlAlchemy: class DeclarativeMeta(type): def __init__(cls, classname, bases, dict_): if ‘_decl_class_registry’ in cls.__dict__: return type.__init__(cls, […]

IPython representación de clases.

Estaba probando IPython con un módulo que creé y no muestra la representación real de los objetos de clase. En cambio, muestra algo como TheClass.__module__ + ‘.’ + TheClass.__name__ Uso mucho las metaclases en este módulo y tengo representaciones de clase realmente significativas que deberían mostrarse al usuario. ¿Existe algún método específico de IPython que […]

Quien llama a la metaclase

Esto en realidad se deriva de una discusión aquí en SO. Version corta def meta(name, bases, class_dict) return type(name, bases, class_dict) class Klass(object): __metaclass__ = meta Se llama a meta() cuando se ejecuta la statement de clase Klass . ¿Qué parte del código (interno de Python) realmente llama meta() ? Versión larga Cuando se declara […]

¿Cómo funciona un objeto classmethod?

Me cuesta entender cómo funciona un objeto classmethod en Python, especialmente en el contexto de las metaclases y en __new__ . En mi caso especial, me gustaría obtener el nombre de un miembro de método de clase, cuando repito los members que se dieron a __new__ . Para los métodos normales, el nombre simplemente se […]

Metaclase para parametrizar la herencia.

He leído algunos tutoriales sobre metaclases de Python. Nunca he usado uno antes, pero necesito uno para algo relativamente simple y todos los tutoriales parecen estar orientados a casos de uso mucho más complejos. Básicamente, quiero crear una clase de plantilla que tenga un cuerpo preespecificado, pero toma su clase base como parámetro. Desde que […]

Anulación de la metaclase de tipo () predeterminada antes de que se ejecute Python

Aquí hay dragones. Has sido advertido. Estoy pensando en crear una nueva biblioteca que intentará ayudar a escribir un mejor conjunto de pruebas. Para hacer eso, una de las características es una característica que verifica que cualquier objeto que se esté utilizando y que no sea el corredor de prueba y el sistema bajo prueba […]

Uso de metaclases para anular métodos de complejos integrados

Como ejercicio de aprendizaje, estoy tratando de implementar una clase que emulará el comportamiento del complex componente de Python, pero con un comportamiento diferente de los métodos __str__ y __repr__ : quiero que se impriman en el formato … (1.0,2.0) …en lugar de: (1+2j) Primero intenté simplemente subclasificar desde complex y redefiniendo __str__ y __repr__ […]

¿Hay alguna razón para elegir __new__ sobre __init__ al definir una metaclase?

Siempre he configurado metaclases como esta: class SomeMetaClass(type): def __new__(cls, name, bases, dict): #do stuff here Pero acabo de encontrar una metaclase que fue definida así: class SomeMetaClass(type): def __init__(self, name, bases, dict): #do stuff here ¿Hay alguna razón para preferir uno sobre el otro? Actualización : tenga en cuenta que estoy preguntando sobre el […]