example - python class
Obtener el nombre de clase de una instancia? (8)
¿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 a falta de analizar el 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 desea.
>>> 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__
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 anidados, 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 lo que estás buscando es la introspección, esto siempre es lo que deberías considerar.
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''
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
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)
<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''
>>>