Pregunta

¿Cómo puedo encontrar un nombre de clase que crea una instancia de un objeto en Python si la función que estoy haciendo esto desde es la clase base de los cuales la clase de la instancia se ha derivado?

inspeccionar el módulo podría me han ayudado a cabo aquí, pero no parece que darme lo que quiero. Y corto de analizar el miembro de __class__, no estoy seguro de cómo llegar a esta información.

¿Fue útil?

Solución

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

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

Este método funciona con única . Su código podría utilizar algunas clases de estilo antiguo. Las siguientes obras para ambos:

x.__class__.__name__

Otros consejos

¿Quieres que 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 la entrada en el intérprete interactivo) producirá '__main__.A' en contraposición a 'A' que se produce si se invoca el atributo __name__. Pasando simplemente el resultado de A.__class__ al constructor str el análisis se maneja para usted. Sin embargo, también se puede utilizar 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.

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

Buena pregunta.

Este es un ejemplo sencillo basado en GHZ de lo 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 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'

Además de agarrar el __name__ atributo, usted puede encontrarse en necesidad de la nombre calificado para una clase / función dada . Esto se hace por el acaparamiento de los tipos __qualname__.

En la mayoría de los casos, éstas serán exactamente lo mismo, pero, cuando se trata de clases / métodos anidados éstos difieren en la salida que se 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'

Desde la introspección es lo que está buscando, esto es siempre es posible que desee considerar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top