2012-04-10 13 views
29
class A(object): 
    def get_class(self): 
     return self.__class__ 

class B(A): 
    def __init__(self): 
     A.__init__(self) 

b = B() 
print b.get_class() 

Este código imprimirá <class '__main__.B'>.¿Obtener el nombre de la clase para padres?

¿Cómo puedo obtener el nombre de la clase donde se ha definido el método (es decir, A)?

+2

es mejor que verifique http://stackoverflow.com/questions/961048/get-class-that-defined-method-in-python – okm

Respuesta

45

De la documentación: https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy

objetos Class tienen un atributo __name__. Podría ser más claro introspectar la (s) clase (s) base a través del atributo __bases__ de la clase derivada (si el código es vivir en la clase derivada, por ejemplo).

>>> class Base(object): 
...  pass 
... 
>>> class Derived(Base): 
...  def print_base(self): 
...   for base in self.__class__.__bases__: 
...    print base.__name__ 
... 
>>> foo = Derived() 
>>> foo.print_base() 
Base 
-3

Usted podría cambiar

return self.__class__ 

return A().__class__ 

Puesto que no hay otra instancia de A() disponibles ...

+6

¿Por qué no simplemente 'return A'? –

27

inspect.getmro(cls)

devolver una tupla de clases base de la Clase CLS, incluyendo cls, para la resolución de métodos. Ninguna clase aparece más de una vez en esta tupla. Tenga en cuenta que el orden de resolución del método depende del tipo cls. A menos que se utilice un metatipo definido por el usuario muy peculiar, cls será el primer elemento de la tupla.

import inspect 
inspect.getmro(B) 

resultado será:

(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>) 

primer elemento es la propia clase, el segundo elemento es siempre el primero de los padres. Después de eso, las cosas pueden ponerse un poco más complicadas.

+4

+1 para esto, ['mro()'] (http://docs.python.org/library/stdtypes.html?highlight=mro#class.__mro__) también es útil – okm

+0

MRO es el orden de resolución del método. verifique aquí, por ej. https://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-classes – Chris

Cuestiones relacionadas