1936 Stimmen

Abrufen des Klassennamens einer Instanz?

Wie finde ich einen Namen der Klasse, die eine Instanz eines Objekts in Python erstellt, wenn die Funktion, die ich tue dies aus ist die Basisklasse, von der die Klasse der Instanz abgeleitet wurde?

Ich dachte, vielleicht das Inspektionsmodul hätte mir hier vielleicht helfen können, aber es scheint mir nicht das zu geben, was ich will. Und kurz vor dem Parsen der __class__ Mitglied, bin ich mir nicht sicher, wie ich an diese Informationen herankomme.

2513voto

sykora Punkte 88704

Haben Sie schon die __name__ Attribut der Klasse? d.h. type(x).__name__ gibt Ihnen den Namen der Klasse an, was Sie wohl auch wollen.

>>> import itertools
>>> x = itertools.count(0)
>>> type(x).__name__
'count'

Wenn Sie noch Python 2 verwenden, beachten Sie, dass die obige Methode mit Klassen im neuen Stil nur (in Python 3+ sind alle Klassen "new-style" Klassen). Ihr Code könnte einige "old-style" Klassen verwenden. Das Folgende funktioniert für beide:

x.__class__.__name__

538voto

mthurlin Punkte 24849

Möchten Sie den Namen der Klasse als Zeichenkette?

instance.__class__.__name__

177voto

GHZ Punkte 3055

type() ?

>>> class A:
...     def whoami(self):
...         print(type(self).__name__)
...
>>>
>>> class B(A):
...     pass
...
>>>
>>>
>>> o = B()
>>> o.whoami()
'B'
>>>

51voto

Jonathan Punkte 479
class A:
  pass

a = A()
str(a.__class__)

Der obige Beispielcode ergibt (bei Eingabe im interaktiven Interpreter) '__main__.A' im Gegensatz zu 'A' die erzeugt wird, wenn die __name__ Attribut aufgerufen wird. Durch einfache Übergabe des Ergebnisses von A.__class__ zum str Konstruktor wird das Parsing für Sie erledigt. Sie können jedoch auch den folgenden Code verwenden, wenn Sie etwas Expliziteres wünschen.

"{0}.{1}".format(a.__class__.__module__,a.__class__.__name__)

Dieses Verhalten kann vorteilhaft sein, wenn Sie Klassen mit demselben Namen in separaten Modulen definiert haben.

Der oben angegebene Beispielcode wurde mit Python 2.7.5 getestet.

30voto

Prasath Punkte 545

In Python 2,

type(instance).__name__ != instance.__class__.__name__
# if class A is defined like
class A():
   ...

type(instance) == instance.__class__
# if class A is defined like
class A(object):
  ...

Beispiel:

>>> class aclass(object):
...   pass
...
>>> a = aclass()
>>> type(a)
<class '__main__.aclass'>
>>> a.__class__
<class '__main__.aclass'>
>>>
>>> type(a).__name__
'aclass'
>>>
>>> a.__class__.__name__
'aclass'
>>>

>>> class bclass():
...   pass
...
>>> b = bclass()
>>>
>>> type(b)
<type 'instance'>
>>> b.__class__
<class __main__.bclass at 0xb765047c>
>>> type(b).__name__
'instance'
>>>
>>> b.__class__.__name__
'bclass'
>>>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X