Wie erhalte ich den Namen der Klasse, in der ich mich gerade befinde?
Beispiel:
def get_input(class_name):
[do things]
return class_name_result
class foo():
input = get_input([class name goes here])
Aufgrund der Art des Programms, mit dem ich verbunden bin (vistrails), kann ich es nicht __init__()
zum Initialisieren verwenden input
.
getName
von einer untergeordneten Klasse aus aufrufen , wird der Name der untergeordneten Klasse ausgegeben. Es wird dann schwierig, wenn Sie WIRKLICH die Klasse wollen, mit der Sie arbeiten.getName
von einer übergeordneten Klasse aufrufen , wird der Name der untergeordneten Klasse ausgegeben? Ok, um darauf hinzuweisen.getName()
Methode zufällig in einer Oberklasse definiert ist) jedoch korrekt.Innerhalb des Hauptteils einer Klasse ist der Klassenname noch nicht definiert und daher nicht verfügbar. Können Sie nicht einfach den Namen der Klasse eingeben? Vielleicht müssen Sie mehr über das Problem sagen, damit wir eine Lösung für Sie finden können.
Ich würde eine Metaklasse erstellen, um diese Arbeit für Sie zu erledigen. Es wird zur Zeit der Klassenerstellung aufgerufen (konzeptionell ganz am Ende der Klasse: block) und kann die zu erstellende Klasse manipulieren. Ich habe das nicht getestet:
quelle
MyType
diesuper
Zeile inInputAssigningMetaclass
?Sie können über die privaten Attribute der Klasse darauf zugreifen:
BEARBEITEN:
Wie gesagt
Ned Batcheler
, würde dies im Klassenkörper nicht funktionieren, aber es würde in einer Methode funktionieren.quelle
PEP 3155 eingeführt
__qualname__
, das in Python 3.3 implementiert wurde.Es ist innerhalb der Definition einer Klasse oder einer Funktion zugänglich, zum Beispiel:
wird effektiv gedruckt
Foo
. Sie erhalten den vollständig qualifizierten Namen (mit Ausnahme des Modulnamens), daher möchten Sie ihn möglicherweise auf den.
Charakter aufteilen .Es gibt jedoch keine Möglichkeit, einen tatsächlichen Überblick über die zu definierende Klasse zu erhalten.
quelle
EDIT: Ja, du kannst; aber du musst schummeln: Der aktuell ausgeführte Klassenname ist auf dem Aufrufstapel vorhanden, und das
traceback
Modul ermöglicht dir den Zugriff auf den Stapel.Ich würde dies jedoch nicht tun. Meine ursprüngliche Antwort ist immer noch meine eigene Präferenz als Lösung. Ursprüngliche Antwort:
Die wahrscheinlich einfachste Lösung ist die Verwendung eines Dekorateurs, der Neds Antwort mit Metaklassen ähnelt, jedoch weniger mächtig ist (Dekorateure sind zu schwarzer Magie fähig, Metaklassen jedoch zu alter, okkulter schwarzer Magie).
quelle
quelle
Ich denke, es sollte so sein:
quelle