2010-05-25 15 views
13

Sto imparando a conoscere le metaclassi in Python. Penso che sia una tecnica molto potente, e sto cercando un buon uso per loro. Vorrei un riscontro del buoni esempi reali utili dell'uso di metaclassi. Non sto cercando codice di esempio su come scrivere un metaclasse (ci sono molti esempi di metaclassi inutili là fuori), ma esempi reali in cui hai applicato la tecnica ed è stata davvero la soluzione appropriata. La regola è: nessuna possibilità teorica, ma metaclassi al lavoro in un'applicazione reale.Buoni usi reali delle metaclassi (ad es. In Python)

inizierò con quello esempio che conosco:

  • modelli Django, per programmazione dichiarativa, dove il modello classe base usa un metaclasse per riempire i oggetti del modello di funzionalità ORM utili da le definizioni degli attributi.

In attesa di contributi.

risposta

0

SQLalchemy li utilizza anche per i modelli di database dichiarativi.

Spiacente, la mia risposta non è molto diversa dal tuo esempio, ma se stai cercando codice di esempio, ho trovato declarative abbastanza leggibile.

3

In Python 2.6 e 3.1, la libreria standard Python fornisce abc.ABCMeta, una meta-classe per Abstract Base Classes ("ABCs"). Le classi che usano la meta-classe possono usare @abstractmethod e @abstractproperty per definire metodi e proprietà astratti. La meta-classe assicurerà che le classi derivate sostituiscano i metodi e le proprietà astratti.

Inoltre, le classi che implementano l'ABC senza ereditarlo effettivamente possono registrarsi come implementando l'interfaccia, in modo che issubclass e isinstance funzionino.

Ad esempio, il modulo collections definisce l'ABC Sequence. Chiama anche Sequence.register(tuple) per registrare il tipo tuple integrato come Sequence, anche se l'tuple non eredita effettivamente da Sequence.

0

L'unica volta che ho utilizzato un metaclasse finora è stato quello di scrivere un meccanismo di avviso di deprecazione. Era qualcosa lungo le seguenti linee - sintassi può essere molto approssimativa, ma il codice illustrerà il mio punto più facilmente di una frase complessa:

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

L'implementazione Python di Protocol Buffers utilizza metaclassi per generare i binding Python che rappresentano il formato dei dati. From the tutorial:

La linea importante in ogni classe è __metaclass__ = reflection.GeneratedProtocolMessageType. Mentre i dettagli di come funzionano le metaclassi Python vanno oltre lo scopo di questo tutorial, puoi considerarli come un modello per la creazione di classi.Al momento del caricamento, il metacarattere GeneratedProtocolMessageType utilizza i descrittori specificati per creare tutti i metodi Python necessari per lavorare con ciascun tipo di messaggio e aggiungerli alle classi pertinenti. È quindi possibile utilizzare le classi completamente popolate nel codice.

Problemi correlati