2012-09-25 13 views
5

Ich bin neu bei Python und versuche, eine Liste der Klassen zu erhalten, von denen die Klasse eines Objekts erbt. Ich versuche, dies mit dem bases Attribut zu tun, aber ich habe keinen Erfolg. Kann mir bitte jemand helfen?Klassenvererbung 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) 

Antwort

6

Nur Klassen haben __bases__; Klasseninstanzen nicht. Sie können das Klassenobjekt über die Instanz __class__ der Instanz abrufen: Verwenden Sie foo(test.__class__) oder foo(Circle).

+0

Vielen Dank –

4

Verwenden inspect von documentation

Return ein Tupel der Klasse cls die Basisklassen, einschließlich cls, in Verfahren Auflösung um. Keine Klasse erscheint mehr als einmal in diesem Tupel. Hinweis , dass die Reihenfolge der Methodenauflösung vom cls-Typ abhängt. Wenn nicht ein eigenartiger benutzerdefinierter Metatyp verwendet wird, ist cls das erste Element des Tupels.

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

Dieser quert die Vererbungshierarchie & druckt alle Klassen, einschließlich object auf. Ziemlich cool, eh?

+0

+1, da es eine Liste aller Klassen zurückgibt. Um es mit dem Beispiel des OP zu arbeiten, glaube ich, dass es "test .__ class__" sein sollte, da "test" eine Instanz in seinem Fall ist? – RocketDonkey

+0

ja sollte es sein "test .__ class__', war in Eile zu beantworten :) –

+0

Ich kenne das Gefühl :) – RocketDonkey

1

Ihre Implementierung von foo funktioniert. Aber Sie müssen eine Klasse an foo übergeben, keine Instanz.

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 danke euch allen. Sehr geschätzt. Ich habe nicht verstanden, dass Objekte keine Basen haben –

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

Oder mit dem inspect Modul:

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