回答:
直接の祖先だけでなく、すべての祖先が必要な場合は、inspect.getmroを使用します。
import inspect
print inspect.getmro(cls)
便利なことに、これはすべての祖先クラスを「メソッド解決順序」、つまり、メソッド(または実際には他の属性)を解決するときに祖先がチェックされる順序を提供します-メソッドと他の属性は同じ名前空間にあります結局のところ、Pythonでは;-)。
cls.__mro__
(少なくともPython 3.5では)を使用することもできます
新しいスタイルのクラスには、メソッド解決順序で親クラスのリストを返す呼び出し可能なmroメソッドがあります。
object
応答しないようですmro
。
x
、我々はコールとメソッド解決順得ることができる type(x).mro()
ならば、我々は考えることができx
ているClassX
:との基本クラスとして ClassX in type(x).mro()
最速の方法は、すべての親を見て、と順番は、ちょうどに建て使用します__mro__
すなわち repr(YOUR_CLASS.__mro__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
出力、順番どおり
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
そこにあります。現在の「最良の」答えは182票です(これを入力しているため)。これは、クラスが2つ以上の親を拡張する場合は言うまでもなく、一度に1つのクラスのベースを調べる複雑なforループよりもはるかに単純です。クラス。インポートして使用するinspect
と、スコープが不必要にクラウド化されます。正直に言うと、ビルトインを使用するだけでは知らないのは残念
これがお役に立てば幸いです。
inspect.getmro
呼び出すだけです。を使用 すると、よりクリーンで読みやすいコードが生成されます。関数呼び出しをスキップする方が確かに高速ですが。__mro__
getmro
親を取得したいだけの場合はベースを使用し、__mro__
(@ naught101で指摘されているように)メソッド解決の順序を取得するために使用します(これにより、initが実行された順序がわかります)。
ベース(および既存のオブジェクトのクラスを最初に取得):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
最近のPythonバージョンのmroの場合:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
もちろん、すでにクラス定義がある場合は__mro__
、それを直接呼び出すことができます。
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
type(C()).__bases__
以下でさらに説明するようにします