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