Die Syntax für die Verwendung der Metaklasse unterscheidet sich zwischen python2.x und python3.x. Auf der anderen Seite möchten Sie möglicherweise beide Versionen in einer Datei unterstützen. Wie schreibe ich in einem solchen Fall.
metaclass(HasVersion)
Es gibt die folgende Metaklasse HasVersionMeta. Eine Meta-Klasse, die einfach eine Zeichenfolge wie eine Versionsnummer hat.
class HasVersionMeta(type):
def __new__(cls, name, bases, attrs):
attrs["version"] = "0.0.1"
return super(HasVersionMeta, cls).__new__(cls, name, bases, attrs)
Ich möchte eine Klasse definieren, die dies verwendet.
Fügen Sie im Fall von python3 die Metaklassenoption zu dem Teil des Arguments hinzu, der zum Zeitpunkt der Vererbung übergeben wurde.
class A(object, metaclass=HasVersionMeta):
pass
Weisen Sie Python2 einem Hook mit einem speziellen Namen metaclass zu
class A(object):
__metaclass__ = HasVersionMeta
Die als Metaklasse verwendete Klasse ist auch ein aufrufbares Objekt. Es sollte dieselbe Funktionalität haben, wenn man bedenkt, dass der übergeordnete Klassentyp () beim dynamischen Generieren einer Klasse verwendet wird. Sie können also wie folgt schreiben.
HasVersion = HasVersionMeta("A", (object, ), {"__doc__": HasVersionMeta.__doc__})
class A(HasVersion):
pass
Arbeiten.
print(A.version)
# 0.0.1
Recommended Posts