2012-09-25 11 views
5

Sono nuovo in Python e sto cercando di ottenere un elenco delle classi da cui eredita una classe di oggetti. Sto cercando di farlo usando l'attributo bases ma non sto avendo alcun successo. Qualcuno può aiutarmi?Ereditarietà di classe in 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) 

risposta

6

Solo le classi hanno __bases__; le istanze di classe non lo fanno. È possibile ottenere l'oggetto classe tramite l'istanza __class__: utilizzare foo(test.__class__) o foo(Circle).

+0

La ringrazio molto –

4

Usa inspect, da documentation

Restituisce una tupla di classi di base della Classe CLS, tra cls, in modo ordine risoluzione. Nessuna classe appare più di una volta in questa tupla. Nota che l'ordine di risoluzione del metodo dipende dal tipo di cls. A meno che non sia in uso un metatype particolare definito dall'utente , cls sarà il primo elemento della tupla.

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

Questo attraversa la gerarchia di ereditarietà & stampe tutte le classi, tra cui object. Abbastanza bello eh?

+0

+1 dal momento che restituisce un elenco di tutte le classi. Per farlo funzionare con l'esempio dell'OP, credo che dovrebbe essere 'test .__ class__' dato che' test' è un'istanza nel suo caso? – RocketDonkey

+0

sì dovrebbe essere 'test .__ class__', avevo fretta di rispondere :) –

+0

Conosco la sensazione :) – RocketDonkey

1

L'implementazione di foo funziona. Ma è necessario passare una classe a foo, non un'istanza.

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 grazie a tutti. Molto apprezzato. Non ho capito che gli oggetti non avevano basi –

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

Oppure, utilizzando il modulo inspect:

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