Obtener el nombre de clase de una instancia
¿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 inspect
módulo o analizar el __class__
atributo.
¿ 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__
¿Quieres el nombre de la clase como una cadena?
instance.__class__.__name__
type()
?
>>> class A:
... 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 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 str
constructor, 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.
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'
>>>