Ich habe Probleme zu verstehen, wie ein Klassenobjekt in Python funktioniert, insbesondere im Zusammenhang mit Metaklassen und in __new__
. In meinem speziellen Fall möchte ich den Namen eines Klassenmethodemitglieds erhalten, wenn ich die members
durchlaufen habe, die __new__
erhalten haben.
Bei normalen Methoden wird der Name einfach in einem __name__
-Attribut gespeichert, aber für eine Klassenmethode gibt es anscheinend kein solches Attribut. Ich sehe nicht einmal, wie die Klassenmethode aufgerufen wird, da es auch kein Attribut __call__
gibt.
Kann mir jemand erklären, wie eine Unterrichtsmethode funktioniert oder auf eine Dokumentation verweisen? Das Googeln führte mich nirgendwohin. Danke!
Ein classmethod
-Objekt ist ein Deskriptor. Sie müssen verstehen, wie Deskriptoren funktionieren.
Kurz gesagt, ein Deskriptor ist ein Objekt mit einer Methode __get__
, die drei Argumente benötigt: self
, ein instance
und ein instance type
.
Wenn bei der normalen Attributsuche ein nachgeschlagenes Objekt A
eine Methode __get__
hat, wird diese Methode aufgerufen, und das Ergebnis wird anstelle des Objekts A
ersetzt. Auf diese Weise werden Funktionen (die auch Deskriptoren sind) gebundene Methoden, wenn Sie eine Methode für ein Objekt aufrufen.
Ein classmethod
-Objekt funktioniert auf die gleiche Weise. Wenn es nachgeschlagen wird, wird seine Methode __get__
aufgerufen. Die __get__
einer Klassenmethode verwirft das Argument, das der instance
entspricht (falls es eine gab) und übergibt nur die instance_type
, wenn sie __get__
für die umbrochene Funktion aufruft.
Ein illustratives Gekritzel:
%Vor%Weitere Informationen zu Deskriptoren finden Sie hier (ua): Ссылка
Für die spezifische Aufgabe, den Namen der Funktion zu erhalten, die von einem classmethod
umschlossen ist:
Tags und Links python metaclass class-method