Metaklassen in Python
In diesem Tutorial wird erläutert, was Metaklassen in einem objektorientierten Kontext in Python sind.
Metaklassen in Python
Einfach ausgedrückt definiert eine Metaklasse das Verhalten einer Klasse. Eine reguläre Klasse definiert, wie sich ein Objekt oder eine Instanz einer Klasse verhält.
In Python sind Metaklassen vorgefertigt und implizit; Dies bedeutet, dass beim Erstellen einer Klasse im Hintergrund eine Metaklasse erstellt wird.
Die Basisklasse object
in Python
In Python erbt jede erzeugte Klasse implizit die Basisklasse object
. Innerhalb der Klasse object
gibt es eingebaute private Methoden wie __init__
und __new__
. Bevor eine Klasse überhaupt beginnt, ihre eigenen Felder, Funktionen und Attribute zu erstellen, erben sie alle Attribute, die in der Klasse object
vorhanden sind.
Erstellen wir zum Beispiel eine neue Klasse, ChildObject
. Innerhalb dieser Klasse ist eine Deklaration eines einzelnen Attributs und einer einzelnen Funktion.
class ChildObject:
num = 1
def printStatement():
print("This is a child object.")
Um zu überprüfen, ob die Klasse ChildObject
alle Attribute und Funktionen der Klasse object
erbt, verwenden Sie die Funktion dir()
, die eine Liste aller in einem bestimmten Objekt definierten Funktionen und Attribute zurückgibt.
print(dir(ChildObject))
Ausgabe:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'num', 'printStatement']
Beachten Sie, dass vor dem Attribut num
und der Funktion printStatement
einige private Attribute und Funktionen existieren, die nicht explizit in ChildObject
definiert sind; das heißt, sie sind entweder implizit innerhalb der Klasse definiert oder werden von der Klasse object
geerbt.
Lassen Sie uns die Attribute und Funktionen der Klasse object
mit derselben Funktion dir()
überprüfen:
print(dir(object))
Ausgabe:
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
Die Metaklasse type
in Python
Nachdem wir nun die Klasse object
behandelt haben, wollen wir die eigentliche Metaklasse in Python, type
, besprechen. Eine Metaklasse ist wiederum eine Klasse, die das Verhalten einer anderen Klasse instanziiert und definiert.
Zwei Funktionen können die Metaklasse einer bestimmten Klasse exponieren: type()
und __class__
. Beide Funktionen geben die Klasse des angegebenen Arguments aus.
Verwenden wir zum Beispiel die Funktionen type()
und __class__
für die gegebene Klasse ChildObject
aus den obigen Beispielen.
class ChildObject:
num = 1
def printStatement():
print("This is a child object.")
print(type(ChildObject))
print(ChildObject.__class__)
Ausgabe:
<class 'type'>
<class 'type'>
Beide Funktionen geben <class 'type'>
aus. Dies signalisiert, dass die Klasse ChildObject
vom Typ type
ist. type
ist die Metaklasse der ChildObject
-Klasse und jeder anderen Klasse.
Zusammenfassend ist type
die Metaklasse, die implizit das Verhalten jeder instanziierten Klasse definiert. Dies gilt nicht als allgemein bekannt, da dies im Hintergrund des Codes ohne Eingreifen des Entwicklers geschieht. Das Konzept einer Metaklasse ist also nur bekannt, wenn jemand tief in den Python-Quellcode und die Dokumentation eintaucht.
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.
LinkedIn