特定のクラスの階層内のすべての基本クラスをリストしますか?
-
05-07-2019 - |
質問
クラス Foo
を指定( new-style クラスであるかどうかを問わず)、継承階層のどこでもベースクラスをすべて生成する方法- issubclass
of?
解決
inspect.getmro(cls)
新しいスタイルのクラスと古いスタイルのクラスの両方で機能し、 NewClass.mro()
と同じものを返します。メソッド解決に使用される順序で、クラスとそのすべての祖先クラスのリストです。
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
他のヒント
利用可能な __ bases __
プロパティをご覧くださいPythonの class
には、基底クラスのタプルが含まれています:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
inspect.getclasstree()
は、クラスとそのベースのネストされたリストを作成します。
使用法:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
クラスオブジェクトの __ bases __
タプルを使用できます:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
__ bases __
によって返されるタプルには、すべての基本クラスがあります。
お役に立てばと思います!
Jochenの答えは非常に有用で正しいですが、inspectモジュールの.getmro()メソッドを使用してクラス階層を取得できるため、Pythonの継承階層が次のようであることを強調することも重要です:
例:
class MyClass(YourClass):
継承クラス
- 子クラス
- 派生クラス
- サブクラス
例:
class YourClass(Object):
継承されたクラス
- 親クラス
- 基本クラス
- スーパークラス
1つのクラスは別のクラスから継承できます -クラスの属性は継承されます -特に、そのメソッドは継承されます -これは、継承(子)クラスのインスタンスが、継承(親)クラスの属性にアクセスできることを意味します
インスタンス-&gt;クラス-&gt;継承されたクラス
使用
import inspect
inspect.getmro(MyClass)
Python内で階層が表示されます。
python 3.7では、inspectをインポートする必要はありません。type.mroは結果を提供します。
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
Python 3.xでは、すべてのクラスがベースオブジェクトクラスから継承することに注意してください。