2012-09-25 70 views
5

Soy nuevo en python y trato de obtener una lista de las clases heredadas por la clase de un objeto. Estoy tratando de hacer esto usando el atributo bases pero no estoy teniendo éxito. ¿Puede alguien ayudarme?Herencia de clase en Python

def foo(C): 
    print(list(C.__bases__)) 

class Thing(object): 
    def f(self): 
     print("Yo") 

class Shape(Thing): 
    def l(self): 
     print("ain't no thang") 

class Circle(Shape): 
    def n(self): 
     print("ain't no shape") 

test = Circle() 
foo(test) 

Respuesta

6

Sólo las clases tienen __bases__; las instancias de clase no. Puede obtener el objeto de clase a través de una instancia de __class__: use foo(test.__class__) o foo(Circle).

+0

Muchas gracias –

4

Uso inspect, desde documentation

devolver una tupla de clases base de cls cls clase, incluyendo, en el método fin resolución. 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 de cls. A menos que se use un metatipo peculiar muy definido por el usuario , cls será el primer elemento de la tupla.

>>> import inspect 
>>> inspect.getmro(test.__class__) 
(<class '__main__.Circle'>, <class '__main__.Shape'>, <class '__main__.Thing'>, <type 'object'>) 
>>> 

Este atraviesa la jerarquía de herencia & impresiones de todas las clases, incluyendo object. Bastante bien, ¿eh?

+0

1 ya que devuelve una lista de todas las clases. Para que funcione con el ejemplo del OP, creo que debería ser 'test .__ class__' ya que' test' es una instancia en su caso. – RocketDonkey

+0

sí debería ser 'test .__ class__', tenía prisa por responder :) –

+0

Sé la sensación :) – RocketDonkey

1

Su implementación de foo funciona. Pero necesita pasar una clase al foo, no una instancia.

In [1]: def foo(C): 
    ...:   print(list(C.__bases__)) 
    ...: 

In [2]: class Thing(object): 
    ...:   def f(self): 
    ...:     print("Yo") 
    ...: 

In [3]: class Shape(Thing): 
    ...:   def l(self): 
    ...:     print("ain't no thang") 
    ...: 

In [4]: class Circle(Shape): 
    ...:   def n(self): 
    ...:     print("ain't no shape") 
    ...: 

In [5]: test = Circle() 

In [6]: foo(test) 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-6-7b85deb1beaa> in <module>() 
----> 1 foo(test) 

<ipython-input-1-acd1789d43a9> in foo(C) 
     1 def foo(C): 
----> 2   print(list(C.__bases__)) 
     3 

AttributeError: 'Circle' object has no attribute '__bases__' 

In [7]: foo(Thing) 
[<type 'object'>] 

In [8]: foo(Circle) 
[<class '__main__.Shape'>] 

In [9]: foo(Shape) 
[<class '__main__.Thing'>] 
+0

Ah gracias a todos. Muy apreciado. No entendí que los objetos no tenían bases –

2
print '\n'.join(base.__name__ for base in test.__class__.__bases__) 

O, usando el módulo inspect:

from inspect import getmro 
print '\n'.join(base.__name__ for base in getmro(test)) 
Cuestiones relacionadas