with_metaclass()
ist eine Utility-Klasse Factory-Funktion durch die six
library zur Verfügung gestellt, um es einfacher Code zu entwickeln, sowohl für Python 2 und 3.
Es schafft eine Basisklasse mit der angegebenen Meta-Klasse für Sie, kompatibel mit die Version von Python, auf der Sie den Code ausführen.
Zitiert aus der Dokumentation:
Erstellen Sie eine neue Klasse mit der Basisklasse Basis und metaclass metaclass. Dies soll in Klassendeklarationen wie folgt verwendet werden:
from six import with_metaclass
class Meta(type):
pass
class Base(object):
pass
class MyClass(with_metaclass(Meta, Base)):
pass
Dies ist erforderlich, da die Syntax eine Metaklasse geändert zwischen Python zu befestigen 2 und 3:
Python 2:
class MyClass(object):
__metaclass__ = Meta
Python 3:
class MyClass(metaclass=Meta):
pass
Die with_metaclass()
Funktion nutzt die Tatsache, dass Metaklassen sind a) von Unterklassen geerbt, und b) eine Metaklasse kann verwendet werden, um neue Klassen zu generieren; es schafft effektiv eine neue Basisklasse durch die Metaklasse als eine Fabrik mit einer leeren Klasse zu generieren:
def with_metaclass(meta, *bases):
"""Create a base class with a metaclass."""
return meta("NewBase", bases, {})
Die NewBase
Basisklasse Metaklasse ist meta
, sowohl auf Python 2 und 3.
Nur um in sechs, die Syntax zu verdeutlichen (um das Verhalten von Python 2 und 3 oben zu entsprechen): 'Klasse MyClass (with_metaclass (Meta, Objekt)): pass' (wo das Objekt optional ist). –