2012-09-25 31 views
5

私はPythonには新しく、オブジェクトのクラスが継承するクラスのリストを取得しようとしています。私はbases属性を使ってこれをしようとしていますが、私は何の成功もしていません。誰かが私を助けてくれますか?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) 

答えて

6

クラスのみが__bases__です。クラスインスタンスはそうではありません。クラスオブジェクトは、インスタンス__class__foo(test.__class__)またはfoo(Circle)を使用して取得できます。

+0

はどうもありがとうございまし –

4
使用 inspect

documentation

戻る方法 解像度のためにCLSを含むクラスCLSの基底クラスのタプルから。このタプルにはクラスが複数回出現しません。 メソッドの解決順序はclsの型に依存することに注意してください。非常に特殊なユーザー定義メタタイプが使用されていない限り、clsはタプルの最初の 要素になります。

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

これは、継承階層&がobject含めたすべてのクラスを、印刷し、最大横断。かなり涼しいええ?

+0

+1、それはクラスのすべてのリストを返すからです。 OPの例で動作させるには、 'test'がインスタンスのインスタンスなので、' test .__ class__'でなければならないと思いますか? – RocketDonkey

+0

はい、 'test .__ class__'でなければなりません。 –

+0

私は感情を知っています:) – RocketDonkey

1

あなたの実装はfooです。しかし、クラスをfooに渡す必要があります。インスタンスではありません。 inspectモジュールを使用して

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

ありがとうございました。とても有難い。私は物に拠点がないことを理解していなかった –

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

または、:

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