クラスが与えられた場合Foo
(新しいスタイルのクラスかどうかにかかわらず)、継承階層のどこかにあるすべての基本クラスをどのように生成しますissubclass
か?
クラスが与えられた場合Foo
(新しいスタイルのクラスかどうかにかかわらず)、継承階層のどこかにあるすべての基本クラスをどのように生成しますissubclass
か?
回答:
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'>)
inspect.getmro(obj)
の代わりにinspect.getmro(type(obj))
。
基本クラスのタプルを含むpython で利用可能な__bases__
プロパティを参照してください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>]
getmro
「このタプルにクラスは2回以上出現しない」と明記されているのはなぜですか?
__bases__
上がるだけです。(再帰的なユーティリティが暗示するように、例では大まかな一見がそれを理解しないかもしれません。)
inspect.getclasstree()
クラスとそのベースのネストされたリストを作成します。使用法:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
Python docによると、class.__mro__
属性またはclass.mro()
メソッドを使用することもできます。
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True
Jochenの答えは非常に役に立ち、正しいですが、inspectモジュールの.getmro()メソッドを使用してクラス階層を取得できるため、Pythonの継承階層が次のようであることを強調することも重要です。
例:
class MyClass(YourClass):
継承クラス
例:
class YourClass(Object):
継承されたクラス
あるクラスは別のクラスから継承できます-クラスの属性が継承されます-特に、そのメソッドが継承されます-これは、継承(子)クラスのインスタンスが継承(親)クラスの属性にアクセスできることを意味します
インスタンス->クラス->継承されたクラス
を使用して
import inspect
inspect.getmro(MyClass)
Python内の階層が表示されます。