Immer die Klassennamen einer Instanz?
-
21-08-2019 - |
Frage
Wie finde ich einen Namen der Klasse aus, die eine Instanz eines Objekts in Python erstellt, wenn die Funktion Ich tue dies aus der Klasse, von der Basis ist die Klasse der Instanz abgeleitet wurde?
vielleicht Dachte das Modul überprüfen könnte mir hat hier geholfen, aber es scheint nicht, mir zu geben, was ich will. Und ermangeln des __class__
Mitglied Parsen, ich bin nicht sicher, wie auf diese Informationen zu erhalten.
Lösung
Haben Sie das __name__
Attribut der Klasse versucht? dh type(x).__name__
geben Sie den Namen der Klasse, was ich denke, ist das, was Sie wollen.
>>> import itertools
>>> x = itertools.count(0)
>>> type(x).__name__
'count'
Diese Methode funktioniert mit neuen Stil Klassen nur . Ihr Code könnte einige im alten Stil-Klassen verwenden. Folgende Arbeiten für beide:
x.__class__.__name__
Andere Tipps
Möchten Sie den Namen der Klasse als String?
instance.__class__.__name__
type ()?
>>> class A(object):
... def whoami(self):
... print type(self).__name__
...
>>>
>>> class B(A):
... pass
...
>>>
>>>
>>> o = B()
>>> o.whoami()
'B'
>>>
class A:
pass
a = A()
str(a.__class__)
Der Beispielcode oben (wenn der Eingang in den interaktiven Interpreter) wird '__main__.A'
erzeugen im Gegensatz zu 'A'
welches Attribut, wenn die __name__
erzeugt wird, wird aufgerufen. Durch einfache das Ergebnis A.__class__
zum str
Konstruktor die Analyse für Dich gehandhabt wird. Allerdings könnte man auch den folgenden Code verwenden, wenn Sie etwas expliziter wollen.
"{0}.{1}".format(a.__class__.__module__,a.__class__.__name__)
Dieses Verhalten kann vorteilhaft sein, wenn Sie Klassen mit dem gleichen Namen definiert in separaten Modulen haben.
Der obigen Beispielcode zur Verfügung gestellt wurde in Python 2.7.5 getestet.
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'
>>>
Gute Frage.
Hier ist ein einfaches Beispiel auf GHZ basiert, die jemand helfen könnten:
>>> 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
Alternativ können Sie das classmethod
Dekorateur verwenden:
class A:
@classmethod
def get_classname(cls):
return cls.__name__
def use_classname(self):
return self.get_classname()
Verwendung :
>>> A.get_classname()
'A'
>>> a = A()
>>> a.get_classname()
'A'
>>> a.use_classname()
'A'
Neben den besonderen erregenden __name__
Attribut, könnte man finden sich in der Notwendigkeit der für eine bestimmte Klasse / Funktion rel="noreferrer">. Dies geschieht, indem die Typen __qualname__
greifen.
In den meisten Fällen werden diese genau die gleichen, aber, wenn es mit verschachtelten Klassen / Methoden beschäftigen diese in der Ausgabe unterscheiden Sie erhalten. Zum Beispiel:
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 Innerlichkeit ist, was Sie nach, ist dies immer Sie vielleicht prüfen.