2012-09-25 15 views
5

Jestem nowy dla Pythona i próbuję uzyskać listę klas, z których dziedziczy klasa obiektu. Próbuję to zrobić przy użyciu atrybutu bases, ale nie mam żadnego sukcesu. Czy ktoś mógłby mi pomóc?Dziedziczenie klas w Pythonie

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) 

Odpowiedz

6

Tylko klasy mają __bases__; wystąpienia klasy nie. Możesz uzyskać obiekt klasy poprzez instancję: __class__: użyj foo(test.__class__) lub foo(Circle).

+0

Dziękuję bardzo –

4

Zastosowanie inspect z documentation

Return krotki klas Base Class CLS CLS, w tym w sposób rozdzielczości kolejności. Żadna klasa nie pojawia się więcej niż jeden raz w tej krotce. Uwaga: , że kolejność rozstrzygnięcia metody zależy od typu kls. O ile nie jest używany bardzo specyficzny typ zdefiniowany przez użytkownika, cls będzie pierwszym elementem krotki.

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

ta przechodzi w górę hierarchii dziedziczenia & wydruki wszystkich klas, w tym object. Pretty Cool eh?

+0

+1 ponieważ zwraca listę wszystkich klas. Aby go uruchomić z przykładem OP, uważam, że powinno to być 'test .__ class__', ponieważ' test' jest instancją w jego przypadku? – RocketDonkey

+0

tak to powinno być 'test .__ klasa__', spieszył się odpowiedzieć :) –

+0

Znam to uczucie :) – RocketDonkey

1

Wasza realizacja foo działa. Ale musisz przekazać klasę do foo, a nie do instancji.

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 dziękuję wam wszystkim. Bardzo doceniane. Nie rozumiałem, że obiekty nie mają baz –

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

Lub za pomocą modułu inspect:

from inspect import getmro 
print '\n'.join(base.__name__ for base in getmro(test)) 
Powiązane problemy