Obtener el nombre de clase de una instancia

Resuelto Dan asked hace 15 años • 12 respuestas

¿Cómo puedo saber el nombre de la clase utilizada para crear una instancia de un objeto en Python?

No estoy seguro de si debo usar el inspectmódulo o analizar el __class__atributo.

Dan avatar Feb 04 '09 18:02 Dan
Aceptado

¿ Has probado el __name__atributo de la clase? es decir type(x).__name__, te dará el nombre de la clase, que creo que es lo que quieres.

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

Si todavía estás usando Python 2, ten en cuenta que el método anterior funciona solo con clases de nuevo estilo (en Python 3+ todas las clases son clases de "nuevo estilo"). Es posible que su código utilice algunas clases de estilo antiguo. Lo siguiente funciona para ambos:

x.__class__.__name__
sykora avatar Feb 04 '2009 12:02 sykora

¿Quieres el nombre de la clase como una cadena?

instance.__class__.__name__
mthurlin avatar Feb 04 '2009 12:02 mthurlin

type()?

>>> class A:
...     def whoami(self):
...         print(type(self).__name__)
...
>>>
>>> class B(A):
...     pass
...
>>>
>>>
>>> o = B()
>>> o.whoami()
'B'
>>>
GHZ avatar Feb 04 '2009 11:02 GHZ
class A:
  pass

a = A()
str(a.__class__)

El código de muestra anterior (cuando se ingresa en el intérprete interactivo) producirá '__main__.A'en lugar de 'A'lo que se produce si __name__se invoca el atributo. Simplemente pasando el resultado A.__class__al strconstructor, el análisis se realiza por usted. Sin embargo, también puedes usar el siguiente código si quieres 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 definidas en módulos separados.

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

Jonathan avatar Jun 09 '2014 23:06 Jonathan

En Python 2,

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)
<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'
>>>
Prasath avatar Apr 30 '2013 05:04 Prasath