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.

War es hilfreich?

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