¿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 cual se deriva 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 sin analizar el __class__
miembro, no estoy seguro de cómo obtener esta información.
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.Si todavía usa Python 2, tenga en cuenta que el método anterior funciona solo con clases de estilo nuevo (en Python 3+ todas las clases son clases de "estilo nuevo"). Su código puede usar algunas clases de estilo antiguo. Lo siguiente funciona para ambos:
fuente
dir(x.__class__)
no lo enumera?__class__
sobre eltype
método? De este modo:type(x).__name__
. ¿No se desaconseja llamar a los miembros de doble subrayado directamente? Sin__name__
embargo, no puedo ver una forma de evitarlo.__class__
directamente para ser compatible con las clases de estilo antiguo, ya que su tipo es justoinstance
.def typename(x): return type(x).__name__
¿Quieres el nombre de la clase como una cadena?
fuente
tipo() ?
fuente
self.__class__.__name__
lugar detype(self).__name__
tener el mismo comportamiento. ¿A menos que haya algotype()
que haga la función que yo no sepa?type(item)
un elemento de la lista, el resultado será<type 'instance'>
mientrasitem.__class__.__name__
contenga el nombre de la clase.El código de muestra anterior (cuando se ingresa en el intérprete interactivo) producirá
'__main__.A'
en lugar del'A'
que se produce si__name__
se invoca el atributo. Simplemente pasando el resultado deA.__class__
alstr
constructor, el análisis se maneja por usted. Sin embargo, también podría usar el siguiente código si desea algo más explícito.Este comportamiento puede ser preferible si tiene clases con el mismo nombre definido en módulos separados.
El código de muestra proporcionado anteriormente se probó en Python 2.7.5.
fuente
Ejemplo:
fuente
Buena pregunta.
Aquí hay un ejemplo simple basado en GHZ que podría ayudar a alguien:
fuente
Alternativamente, puede usar el
classmethod
decorador:Uso :
fuente
Además de obtener el
__name__
atributo 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 los mismos, pero, cuando se trata de clases / métodos anidados, estos difieren en el resultado que obtiene. Por ejemplo:
Como la introspección es lo que buscas, esto siempre es lo que querrás considerar.
fuente
__qualname__
Cabe señalar que es para Python 3.3+__qualname__
vs__name__
: stackoverflow.com/questions/58108488/what-is-qualname-in-pythonPara obtener el nombre de clase de instancia:
o
ambos son iguales
fuente