with_metaclass()
è una funzione di classe di utilità fabbrica fornita dal six
library per rendere più semplice lo sviluppo di codice sia per Python 2 e 3.
Si crea una classe base con la classe meta specificato per voi, compatibile con la versione di Python su cui stai eseguendo il codice.
Citando dalla documentazione:
creare una nuova classe con base classe base e metaclasse metaclasse. Questo è stato progettato per essere utilizzato in dichiarazioni di classe come questo:
from six import with_metaclass
class Meta(type):
pass
class Base(object):
pass
class MyClass(with_metaclass(Meta, Base)):
pass
Ciò è necessario perché la sintassi per collegare una metaclasse cambiato tra Python 2 e 3:
Python 2:
class MyClass(object):
__metaclass__ = Meta
Python 3:
class MyClass(metaclass=Meta):
pass
Il La funzione with_metaclass()
si avvale del fatto che le metaclassi sono a) ereditate dalle sottoclassi e b) una metaclasse può essere utilizzata per generare nuove classi; si crea effettivamente una nuova classe di base utilizzando la metaclasse come una fabbrica di generare una classe vuota:
def with_metaclass(meta, *bases):
"""Create a base class with a metaclass."""
return meta("NewBase", bases, {})
metaclasse La classe NewBase
base è meta
, sia su Python 2 e 3.
fonte
2013-08-29 14:34:19
Giusto per chiarire, in sei, la sintassi (per abbinare il comportamento di python 2 e 3 sopra): 'classe MyClass (with_metaclass (Meta, object)): pass' (dove l'oggetto è facoltativo). –