Frage Abrufen des Klassennamens einer Instanz in Python


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

Dachte vielleicht das Inspektionsmodul Vielleicht hat es mir hier geholfen, aber es scheint mir nicht zu geben, was ich will. Und kurz, um das zu analysieren __class__ Mitglied, ich bin mir nicht sicher, wie ich an diese Informationen herankomme.


997
2018-02-04 11:37


Ursprung


Antworten:


Hast du das versucht? __name__ Attribut der Klasse? dh type(x).__name__ Ich gebe dir den Namen der Klasse, die ich denke was du willst.

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

Diese Methode funktioniert mit neue Klassen nur. Ihr Code könnte einige alte Klassen verwenden. Das Folgende funktioniert für beide:

x.__class__.__name__

1340
2018-02-04 12:02



Möchten Sie den Namen der Klasse als Zeichenfolge?

instance.__class__.__name__

280
2018-02-04 12:02



Art() ?

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

70
2018-02-04 11:42



class A:
  pass

a = A()
str(a.__class__)

Der obige Beispielcode (bei Eingabe im interaktiven Interpreter) wird erzeugt '__main__.A' im Gegensatz zu 'A' was produziert wird, 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 möchten.

"{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 obige Beispielcode wurde in Python 2.7.5 getestet.


25
2018-06-09 23:04



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

24
2018-04-30 05:50



Gute Frage.

Hier ist ein einfaches Beispiel basierend auf GHZs, das 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

13
2018-02-21 19:07



Abgesehen davon, das Besondere zu ergreifen __name__ Attribut, Sie könnten sich der Notwendigkeit der qualifizierter Name für eine gegebene Klasse / Funktion. Dies geschieht durch Ergreifen der Typen __qualname__.

In den meisten Fällen sind diese genau gleich, aber wenn Sie mit verschachtelten Klassen / Methoden arbeiten, unterscheiden sich diese in der Ausgabe, die Sie erhalten. Beispielsweise:

class Spam:
    def meth(self):
        pass
    class Bar:
        pass

>>> s = Spam()
>>> type(s).__name__ 
'Spam'
>>> type(s).__qualname__
'Spam'
>>> type(s).Bar.__name__       # type not needed here
'Bar'
>>> type(s).Bar.__qualname__   # type not needed here 
'Spam.Bar'
>>> type(s).meth.__name__
'meth'
>>> type(s).meth.__qualname__
'Spam.meth'

Da du nach Introspektion suchst, solltest du das immer berücksichtigen.


4
2017-07-12 15:01