magic example data __str__ __getitem__ __eq__ python introspection instanceof python-datamodel

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