5

私はPythonが初めてで、オブジェクトのクラスが継承するクラスのリストを取得しようとしています。属性を使用してこれを実行しようとしていbasesますが、成功していません。誰かが私を助けてくれますか?

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)
4

4 に答える 4

6

クラスだけが持ってい__bases__ます; クラス インスタンスはそうではありません。インスタンスの__class__: usefoo(test.__class__)またはを介し​​てクラス オブジェクトを取得できますfoo(Circle)

于 2012-09-25T02:36:27.173 に答える
4

ドキュメントinspectからの使用

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

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

これは、継承階層をたどり、 を含むすべてのクラスを出力しますobject。プリティクールえ?

于 2012-09-25T02:36:36.007 に答える
2
print '\n'.join(base.__name__ for base in test.__class__.__bases__)

または、次のinspectモジュールを使用します。

from inspect import getmro
print '\n'.join(base.__name__ for base in getmro(test))
于 2012-09-25T02:40:51.217 に答える
1

作品の実装foofooただし、インスタンスではなくクラスを に渡す必要があります。

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'>]
于 2012-09-25T02:37:10.767 に答える