Obtener el nombre de clase de una instancia?

¿Cómo puedo encontrar un nombre de clase que haya creado una instancia de un objeto en Python si la función de la que estoy haciendo esto es la clase base de la que se derivó la clase de la instancia?

Estaba pensando que tal vez el módulo de inspección podría haberme ayudado aquí, pero no parece darme lo que quiero. Y __class__ de analizar al miembro de __class__ , no estoy seguro de cómo obtener esta información.

¿Has probado el atributo __name__ de la clase? es decir, type(x).__name__ le dará el nombre de la clase, que creo que es lo que quiere.

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

Este método funciona solo con clases de nuevo estilo . Su código podría usar algunas clases de estilo antiguo. Los siguientes trabajos para ambos:

 x.__class__.__name__ 

¿Quieres el nombre de la clase como una cadena?

 instance.__class__.__name__ 

tipo() ?

 >>> 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__) 

El código de ejemplo anterior (cuando se '__main__.A' en el intérprete interactivo) producirá '__main__.A' en lugar de 'A' que se produce si se invoca el atributo __name__ . Simplemente pasando el resultado de A.__class__ al constructor de str el análisis se maneja por usted. Sin embargo, también puede utilizar el siguiente código si desea algo más explícito.

 "{0}.{1}".format(a.__class__.__module__,a.__class__.__name__) 

Este comportamiento puede ser preferible si tiene clases con el mismo nombre definido en módulos separados.

El código de ejemplo proporcionado anteriormente se probó en Python 2.7.5.

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

Ejemplo:

 >>> class aclass(object): ... pass ... >>> a = aclass() >>> type(a)  >>> a.__class__  >>> >>> type(a).__name__ 'aclass' >>> >>> a.__class__.__name__ 'aclass' >>> >>> class bclass(): ... pass ... >>> b = bclass() >>> >>> type(b)  >>> b.__class__  >>> type(b).__name__ 'instance' >>> >>> b.__class__.__name__ 'bclass' >>> 

Buena pregunta.

Aquí hay un ejemplo simple basado en GHZ que podría ayudar a alguien:

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

Alternativamente, puede utilizar el decorador classmethod :

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

Uso

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

Además de capturar el atributo __name__ especial, es posible que necesite el nombre calificado para una clase / función determinada. Esto se hace agarrando los tipos __qualname__ .

En la mayoría de los casos, estos serán exactamente iguales, pero, al tratar con clases / métodos nesteds, estos difieren en la salida que obtiene. Por ejemplo:

 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' 

Ya que la introspección es lo que está buscando, esto es lo que siempre debería considerar.