Metaklassen in Python

Rayven Esplanada 4 Dezember 2021
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.

Rayven Esplanada avatar Rayven Esplanada avatar

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

Verwandter Artikel - Python Class