Abrufen des Klassennamens einer Instanz

Lesezeit: 5 Minuten

Benutzer-Avatar
Dan

Wie finde ich den Namen der Klasse heraus, die zum Erstellen einer Instanz eines Objekts in Python verwendet wird?

Ich bin mir nicht sicher, ob ich die verwenden soll inspect Modul oder analysieren Sie die __class__ Attribut.

  • Was genau “parsen” Sie aus dem Klasse Variable?

    – Sykora

    4. Februar 2009 um 11:49 Uhr

  • der Name der obersten Ebene der Klasse, zu der die Instanz gehört (ohne Modulnamen usw.)

    – Dan

    4. Februar 2009 um 11:50 Uhr

Benutzer-Avatar
Sykora

Hast du die probiert __name__ Attribut der Klasse? dh type(x).__name__ wird Ihnen den Namen der Klasse geben, was meiner Meinung nach das ist, was Sie wollen.

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

Wenn Sie immer noch Python 2 verwenden, beachten Sie, dass die obige Methode mit funktioniert Klassen neuen Stils nur (in Python 3+ sind alle Klassen “neue” Klassen). Ihr Code verwendet möglicherweise einige Klassen im alten Stil. Folgendes funktioniert für beide:

x.__class__.__name__

  • Erstaunlich einfach. Fragen, warum dir(x.__class__) listet es nicht auf?

    – cfi

    21. Januar 2013 um 10:40 Uhr

  • Warum verwenden __class__ über dem type Methode? So: type(x).__name__. Wird nicht direkt davon abgeraten, Mitglieder mit doppeltem Unterstrich anzurufen? Ich sehe keinen Weg um die Verwendung herum __name__obwohl.

    – jpmc26

    7. März 2013 um 20:41 Uhr


  • Sie müssen verwenden __class__ direkt mit Klassen alten Stils kompatibel sein, da ihr Typ gerecht ist instance.

    – Quantum7

    7. August 2013 um 19:50 Uhr


  • Dies wird oft genug im Protokollierungs-, Orm- und Framework-Code verwendet, dass es wirklich einen eingebauten Typnamen (x) geben sollte … der einen Benutzer dazu auffordert, auf die “Eingeweide” zu schauen, um einen zu bekommen Name ist nicht furchtbar pythonisch, IMO.

    – Erik Aronesty

    18. April 2018 um 13:19 Uhr

  • @ErikAronesty, def typename(x): return type(x).__name__

    – Schlank

    12. August 2018 um 22:07 Uhr

Möchten Sie den Namen der Klasse als Zeichenfolge?

instance.__class__.__name__

  • Oder instance.__class__ um das Klassenobjekt zu erhalten 😀

    – Bleistiftcheck

    28. Mai 2013 um 11:15 Uhr

  • Ist es sicher, Eigenschaften mit doppeltem Unterstrich zu verwenden?

    – Eduard Lukas

    5. September 2014 um 11:11 Uhr

  • @EduardLuca warum wäre es nicht sicher? Integrierte Eigenschaften verwenden Unterstriche, damit sie keinen Konflikt mit dem von Ihnen geschriebenen Code verursachen

    Benutzer4396006

    10. Juli 2015 um 20:48 Uhr


  • Nun, ich weiß, dass einzelne Unterstriche bedeuten / vorschlagen, dass die Methode / Eigenschaft privat sein sollte (obwohl Sie private Methoden in Python AFAIK nicht wirklich implementieren können), und ich habe mich gefragt, ob dies auch bei (einigen) doppelten Unterstrichen nicht der Fall ist.

    – Eduard Lukas

    13. Juli 2015 um 9:07 Uhr

  • @EduardLuca Doppelte Unterstriche nur am Anfang ähneln einem einzelnen Unterstrich am Anfang, sind aber noch “privater” (siehe “Python-Namensverstümmelung”). Doppelter Unterstrich am Anfang und Ende sind anders – diese sind für Python reserviert und nicht privat (zB magische Methoden wie __init__ und __add__).

    – Leagsaidh Gordon

    10. August 2015 um 22:33 Uhr


Benutzer-Avatar
GHZ

type() ?

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

  • Ich mag dieses. Auf diese Weise ist es möglich, in einer Basisklasse den Namen der Unterklasse zu erhalten.

    – Jockee

    4. Juni 2012 um 11:43 Uhr


  • oder self.__class__.__name__ Anstatt von type(self).__name__ um das gleiche Verhalten zu bekommen. Es sei denn, es gibt etwas, das type() Funktion, die mir nicht bekannt ist?

    – andreb

    20. August 2012 um 21:47 Uhr

  • Wenn Sie verwenden type(item) auf einem Listenelement wird das Ergebnis sein <type 'instance'> während item.__class__.__name__ enthält den Klassennamen.

    – Grotschni

    6. August 2014 um 9:43 Uhr

  • Ich denke, das Problem, das @Grochni erwähnt, ist nur für bestimmte Klassen in Python 2.x relevant, siehe hier: stackoverflow.com/questions/6666856/…

    – Nate CK

    22. Februar 2015 um 18:09 Uhr

class A:
  pass

a = A()
str(a.__class__)

Der obige Beispielcode (bei Eingabe in den interaktiven Interpreter) erzeugt '__main__.A' im Gegensatz zu 'A' die entsteht, wenn die __name__ Attribut wird aufgerufen. Durch einfaches Übergeben des Ergebnisses von A.__class__ zum str Konstruktor wird das Parsen 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 vorzuziehen sein, wenn Sie Klassen mit demselben Namen in separaten Modulen definiert haben.

Der oben bereitgestellte Beispielcode wurde in Python 2.7.5 getestet.

Benutzer-Avatar
Prasath

In Python2,

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'
>>>

  • Dies gilt nur für altes Python 2.x. In 3.x würde bclass() in bclass(object) aufgelöst werden. Und selbst dann tauchten in Python 2.2 neue Klassen auf.

    – Alkalde

    19. September 2013 um 3:56 Uhr

Alternativ können Sie die verwenden classmethod Dekorateur:

class A:
    @classmethod
    def get_classname(cls):
        return cls.__name__

    def use_classname(self):
        return self.get_classname()

Verwendungszweck:

>>> A.get_classname()
'A'
>>> a = A()
>>> a.get_classname()
'A'
>>> a.use_classname()
'A'

  • Dies gilt nur für altes Python 2.x. In 3.x würde bclass() in bclass(object) aufgelöst werden. Und selbst dann tauchten in Python 2.2 neue Klassen auf.

    – Alkalde

    19. September 2013 um 3:56 Uhr

Benutzer-Avatar
RyanN

Gute Frage.

Hier ist ein einfaches Beispiel, das auf GHZ basiert und jemandem helfen könnte:

>>> class person(object):
        def init(self,name):
            self.name=name
        def info(self)
            print "My name is {0}, I am a {1}".format(self.name,self.__class__.__name__)
>>> bob = person(name="Robert")
>>> bob.info()
My name is Robert, I am a person

1159630cookie-checkAbrufen des Klassennamens einer Instanz

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy