2010-05-25 18 views
13

Estoy aprendiendo acerca de las metaclases en Python. Creo que es una técnica muy poderosa, y estoy buscando buenos usos para ellos. Me gustaría recibir algunos comentarios de buenos ejemplos reales del uso de las metaclases. No estoy buscando un código de ejemplo sobre cómo escribir una metaclase (hay muchos ejemplos de metaclases inútiles), pero ejemplos reales donde ha aplicado la técnica y realmente fue la solución adecuada. La regla es: no hay posibilidades teóricas, pero las metaclases funcionan en una aplicación real.Buenos usos del mundo real de las metaclases (por ejemplo, en Python)

Voy a empezar con el ejemplo que conozco:

  • modelos de Django, para programación declarativa, donde el modelo de clase base utiliza una metaclase para llenar los objetos del modelo de funcionalidad útil a partir de ORM las definiciones de atributos.

Mirando hacia adelante a sus contribuciones.

Respuesta

2

FormEncode validadores y Turbogears/Tosca widgets.

También te puede interesar classdecorators: se pueden escribir con las últimas versiones y cubren muchos casos de uso que se manejaron previamente con metaclases.

0

SQLalchemy también los usa para modelos de bases de datos declarativas.

Lo siento, mi respuesta no es muy diferente de su ejemplo, pero si está buscando un código de ejemplo, encontré que declarative es bastante legible.

3

En Python 2.6 y 3.1, la biblioteca estándar de Python proporciona un abc.ABCMeta, una metaclase para clases base abstractas ("ABCs"). Las clases que usan la metaclase pueden usar @abstractmethod y @abstractproperty para definir métodos y propiedades abstractos. La metaclase asegurará que las clases derivadas anulen los métodos y propiedades abstractos.

Además, las clases que implementan el ABC sin realmente heredar pueden registrarse como implementando la interfaz, de modo que issubclass y isinstance funcionarán.

Por ejemplo, el módulo de collections define el ABC Sequence. También se pide Sequence.register(tuple) para registrar la incorporada en el tipo tuple como Sequence, a pesar de que tuple en realidad no heredar de Sequence.

0

La única vez que utiliza una metaclase hasta ahora era escribir un mecanismo de alerta desaprobación. Era algo a lo largo de las siguientes líneas - sintaxis puede ser muy aproximado, pero el código va a ilustrar mi punto más fácilmente que una frase complicada:

class New(object): 
    pass 

class Old(object): 
    def __new__(self): 
    deprecation_warning("Old class is no more supported, use New class instead") 
    return New() 
2

aplicación El pitón de Protocol Buffers utiliza metaclases para generar los enlaces Python que representan a su formato de datos. From the tutorial:

La línea importante en cada clase es __metaclass__ = reflection.GeneratedProtocolMessageType. Si bien los detalles de cómo funcionan las metaclases de Python están más allá del alcance de este tutorial, puede considerarlos como una plantilla para crear clases.En el momento de la carga, la metaclase GeneratedProtocolMessageType utiliza los descriptores especificados para crear todos los métodos de Python que necesita para trabajar con cada tipo de mensaje y los agrega a las clases relevantes. Luego puede usar las clases completamente pobladas en su código.

Cuestiones relacionadas