Wie finde ich einen Klassennamen heraus, der eine Instanz eines Objekts in Python erstellt hat, wenn die Funktion, von der ich dies mache, die Basisklasse ist, von der die Klasse der Instanz abgeleitet wurde?
Ich dachte, vielleicht hat mir das Inspektionsmodul hier geholfen, aber es scheint mir nicht das zu geben, was ich will. Und kurz bevor __class__
ich das Mitglied analysiere , bin ich mir nicht sicher, wie ich an diese Informationen kommen soll.
Antworten:
Haben Sie das
__name__
Attribut der Klasse ausprobiert ? dhtype(x).__name__
geben Sie den Namen der Klasse, die ich denke, ist, was Sie wollen.Wenn Sie immer noch Python 2 verwenden, beachten Sie, dass die obige Methode nur mit Klassen neuen Stils funktioniert (in Python 3+ sind alle Klassen Klassen neuen Stils). Ihr Code verwendet möglicherweise einige Klassen alten Stils. Folgendes funktioniert für beide:
quelle
dir(x.__class__)
es nicht auflistet?__class__
über dietype
Methode verwenden? Wie so :type(x).__name__
. Wird das Anrufen von Mitgliedern mit doppeltem Unterstrich nicht direkt entmutigt? Ich sehe jedoch keinen Weg, um es zu benutzen__name__
.__class__
direkt verwenden, um mit Klassen alten Stils kompatibel zu sein, da deren Typ gerecht istinstance
.def typename(x): return type(x).__name__
Möchten Sie den Namen der Klasse als Zeichenfolge?
quelle
Art() ?
quelle
self.__class__.__name__
anstatttype(self).__name__
das gleiche Verhalten zu bekommen. Es sei denn, es gibt etwas, dessentype()
Funktion mir nicht bekannt ist?type(item)
ein Listenelement verwenden, wird das Ergebnis angezeigt,<type 'instance'>
solangeitem.__class__.__name__
der Klassenname enthalten ist.Der obige Beispielcode (bei Eingabe in den interaktiven Interpreter) erzeugt
'__main__.A'
im Gegensatz zu'A'
dem, der erzeugt wird, wenn das__name__
Attribut aufgerufen wird. Durch einfaches Übergeben des ErgebnissesA.__class__
an denstr
Konstruktor wird die Analyse für Sie durchgeführt. Sie können jedoch auch den folgenden Code verwenden, wenn Sie etwas expliziteres wünschen.Dieses Verhalten kann vorzuziehen sein, wenn Sie Klassen mit demselben Namen in separaten Modulen definiert haben.
Der oben bereitgestellte Beispielcode wurde in Python 2.7.5 getestet.
quelle
Beispiel:
quelle
Gute Frage.
Hier ist ein einfaches Beispiel basierend auf GHZs, das jemandem helfen könnte:
quelle
Alternativ können Sie den
classmethod
Dekorateur verwenden:Verwendung :
quelle
Abgesehen davon
__name__
, dass Sie das spezielle Attribut abrufen, benötigen Sie möglicherweise den qualifizierten Namen für eine bestimmte Klasse / Funktion. Dies geschieht durch Ergreifen der Typen__qualname__
.In den meisten Fällen sind diese genau gleich, aber beim Umgang mit verschachtelten Klassen / Methoden unterscheiden sich diese in der Ausgabe, die Sie erhalten. Zum Beispiel:
Da Introspektion das ist, wonach Sie suchen, sollten Sie dies immer in Betracht ziehen.
quelle
__qualname__
für Python 3.3+__qualname__
vs__name__
: stackoverflow.com/questions/58108488/what-is-qualname-in-pythonSo erhalten Sie den Klassennamen der Instanz:
oder
beide sind gleich
quelle