Metaklassen sind dafür verantwortlich, Klassenobjekte in Python zu erstellen. So wie Klassen Instanzen erstellen, erstellen Metaklassen Klassen. Sie bieten eine Kontrolle über den Erstellungsprozess der Klassen und ermöglichen die Anpassung des Klassenverhaltens und der Attribute.
In Python sind Klassen Objekte, die den Blauprint zum Erstellen neuer Instanzen oder Objekte beschreiben. Dies bedeutet, dass Klassen selbst Instanzen sind, die aus einer "Beschreibung" der Klasse mit dem Schlüsselwort der Klasse erstellt wurden. Somit erstellt die folgende Aussage ein Klassenobjekt mit dem Namen ObjectCreator:
class ObjectCreator(object): pass
Da Klassen Objekte sind, können Sie sie auch zur Laufzeit dynamisch erstellen. Mit der Typ -Funktion können Sie eine Klasse definieren, indem Sie ihren Namen, Basen und Attributen als Argumente angeben. Es gibt ein neu erstelltes Klassenobjekt zurück.
Foo = type('Foo', (), {'bar': True}) print(Foo) #print(Foo.bar) # True
Jetzt kommen wir zu Metaclasses. Sie sind das "Zeug", das diese Klassenobjekte erstellt. So wie Klassen Instanzen erstellen, erstellen Metaklassen Klassen. Sie sind effektiv die Klassen hinter den Szenen, die Python automatisch zum Erstellen von Klassen verwendet, die mit dem Klassenschlüsselwort definiert sind. In Python 3 wurde dies durch ein Schlüsselwortargument in der Liste der Basisklassen ersetzt.
Eine Metaklasse kann die Klasse ändern, die sie erstellt, und ermöglicht ein dynamisches Klassenverhalten. Sie können beispielsweise eine Metaklas definieren, die alle Klassenattribute automatisch in Großbuchstaben umwandelt:
# Python 2 class Foo(object, __metaclass__=MyMetaclass): ... # Python 3 class Foo(object, metaclass=MyMetaclass): ...
Klasse Foo (Objekt, metaClass = opperattretaclass): bar = 'bip' print (foo.bar) # 'bip'
class UpperAttrMetaclass(type): def __new__(cls, clsname, bases, attrs): uppercase_attrs = { attr if attr.startswith('__') else attr.upper(): v for attr, v in attrs.items() } return super().__new__(cls, clsname, bases, uppercase_attrs)
Während Sie normalerweise keine Metaklasse benötigen, finden sie Anwendungsfälle in der Erstellung von APIs, die die Komplexität der Klassenänderung hinter einer einfachen Schnittstelle abstrahieren. Zum Beispiel verwendet Djangos ORM Metaklassen, um Datenbankfelder mit einfachen Aussagen wie Charfield und Integerfield zu definieren. Es ist jedoch wichtig zu beachten, dass sie komplex sind und nur bei Bedarf verwendet werden sollten, um unnötige Komplikationen zu vermeiden.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3