Was sind Metaklassen in Python und wofür werden sie verwendet?
Antworten
Zu viele Anzeigen?Ich habe einen interessanten Anwendungsfall für Metaklassen in einem Paket namens classutilities
. Es wird geprüft, ob alle Klassenvariablen in Großbuchstaben geschrieben sind (es ist praktisch, eine einheitliche Logik für Konfigurationsklassen zu haben), und es wird geprüft, ob es keine Methoden auf Instanzebene in der Klasse gibt. Ein weiteres interessantes Beispiel für Metaclases war die Deaktivierung von Unittests auf der Grundlage komplexer Bedingungen (Überprüfung der Werte mehrerer Umgebungsvariablen).
Was ist Metaprogrammierung?
Zusammenfassend kann man sagen, dass Metaprogrammierung der Code ist, der den Code manipuliert. Python unterstützt eine Form der Metaprogrammierung für Klassen, die sogenannten Metaklassen.
Wann zu verwenden:
Normalerweise wird sie für etwas Kompliziertes verwendet, aber ein paar Fälle, in denen wir Metaklassen verwenden, sind -
- Metaklassen pflanzen sich in der Vererbungshierarchie nach unten fort. Sie wirkt sich auch auf alle Unterklassen aus. Wenn wir eine solche Situation haben, sollten wir Metaklassen verwenden.
- Wenn wir eine Klasse automatisch ändern wollen, wenn sie erstellt wird, verwenden wir Metaklassen.
- Für die API-Entwicklung können wir Metaklassen verwenden.
- Weitere Funktionen während der Erstellung: Protokollierung und Profilerstellung, Schnittstellenprüfung, Registrierung von Klassen zum Zeitpunkt der Erstellung, automatisches Hinzufügen neuer Methoden automatische Erstellung von Eigenschaften, Proxies, automatische Ressourcen, Sperren/Synchronisierung.
Klasse Fabrik:
Eine Metaklasse wird meist als Klassenfabrik verwendet. Wenn Sie ein Objekt durch Aufruf der Klasse erstellen, erzeugt Python eine neue Klasse durch Aufruf der Metaklasse.
> In Kombination mit dem normalen __init__
y __new__
Methoden, Metaklassen, ermöglichen es Ihnen, bei der Erstellung einer Klasse zusätzliche Dinge zu tun, z. B. die neue Klasse bei einer Registrierung zu registrieren oder die Klasse durch etwas völlig anderes zu ersetzen.
1- __new__():
Es ist eine Methode, die aufgerufen wird, bevor __init__()
. Sie erstellt das Objekt und gibt es zurück. Wir können diese Methode außer Kraft setzen, um zu steuern, wie die Objekte erstellt werden.
2- __init__():
Diese Methode initialisiert lediglich das erstellte Objekt, das als Parameter übergeben wird.
Möglichkeiten der Definition von Metaklassen:
1- Methode 1:
class MyMeta1(type):
def __new__(cls, name, bases, dict):
pass
2- Methode 2:
class MyMeta2(type):
def __init__(self, name, bases, dict):
pass
In Python ist eine Metaklasse eine Unterklasse einer Unterklasse, die bestimmt, wie sich eine Unterklasse verhält. Eine Klasse ist eine Instanz einer anderen Metaklasse. In Python legt eine Klasse fest, wie sich die Instanz der Klasse verhalten soll.
Da Metaklassen für die Generierung von Klassen zuständig sind, können Sie Ihre eigenen benutzerdefinierten Metaklassen schreiben, um die Art und Weise der Klassenerstellung zu ändern, indem Sie zusätzliche Aktionen durchführen oder Code einfügen. Benutzerdefinierte Metaklassen sind nicht immer wichtig, aber sie können es sein.
Sehen Sie sich das an:
Python 3.10.0rc2 (tags/v3.10.0rc2:839d789, Sep 7 2021, 18:51:45) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class Object:
... pass
...
>>> class Meta(type):
... test = 'Worked!!!'
... def __repr__(self):
... return 'This is "Meta" metaclass'
...
>>> class ObjectWithMetaClass(metaclass=Meta):
... pass
...
>>> Object or type(Object())
<class '__main__.Object'>
>>> ObjectWithMetaClass or type(ObjectWithMetaClass())
This is "Meta" metaclass
>>> Object.test
AttributeError: ...
>>> ObjectWithMetaClass.test
'Worked!!!'
>>> type(Object)
<class 'type'>
>>> type(ObjectWithMetaClass)
<class '__main__.Meta'>
>>> type(type(ObjectWithMetaClass))
<class 'type'>
>>> Object.__bases__
(<class 'object'>,)
>>> ObjectWithMetaClass.__bases__
(<class 'object'>,)
>>> type(ObjectWithMetaClass).__bases__
(<class 'type'>,)
>>> Object.__mro__
(<class '__main__.Object'>, <class 'object'>)
>>> ObjectWithMetaClass.__mro__
(This is "Meta" metaclass, <class 'object'>)
>>>
Mit anderen Worten, wenn ein Objekt nicht erstellt wurde (Art des Objekts), suchen wir MetaClass.
- See previous answers
- Weitere Antworten anzeigen