Pregunta Obtener el nombre de clase de una instancia en Python


¿Cómo averiguo el nombre de la clase que creó una instancia de un objeto en Python si la función de la que estoy haciendo esto es la clase base de la cual se ha derivado la clase de la instancia?

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


997
2018-02-04 11:37


origen


Respuestas:


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

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

x.__class__.__name__

1340
2018-02-04 12:02



¿Quieres el nombre de la clase como una cadena?

instance.__class__.__name__

280
2018-02-04 12:02



tipo() ?

>>> class A(object):
...    def whoami(self):
...       print type(self).__name__
...
>>>
>>> class B(A):
...    pass
...
>>>
>>>
>>> o = B()
>>> o.whoami()
'B'
>>>

70
2018-02-04 11:42



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' Opuesto a 'A' que se produce si el __name__ atributo es invocado. Simplemente pasando el resultado de A.__class__ al str constructor, el análisis se maneja 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 definido en módulos separados.

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


25
2018-06-09 23:04



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

24
2018-04-30 05:50



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

13
2018-02-21 19:07



Además de agarrar el especial __name__ atributo, podría encontrarse en la necesidad del nombre calificado para una clase / función dada. Esto se hace agarrando los tipos __qualname__.

En la mayoría de los casos, estos serán exactamente iguales, pero cuando se trata de clases / métodos anidados, estos difieren en el resultado que obtienes. 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 lo que buscas es introspección, esto es lo que siempre debes considerar.


4
2017-07-12 15:01



Alternativamente puedes usar el classmethod decorador:

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'

4
2017-09-13 19:11