Foo
クラス(新しいスタイルのクラスであるかどうかに関係なく)が与えられた場合、継承階層のどこかにあるすべての基本クラスをどのように生成しますissubclass
か?
7 に答える
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'>)
基本クラスのタプルを含む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>]
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__
は、すべての基本クラスがあります。
Pythonのドキュメントによると、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
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では、すべてのクラスが基本オブジェクトクラスを継承していることに注意してください。
Jochenの答えは非常に役立ち、正しいものですが、inspectモジュールの.getmro()メソッドを使用してクラス階層を取得できるため、Pythonの継承階層が次のとおりであることを強調することも重要です。
元:
class MyClass(YourClass):
継承クラス
- 子クラス
- 派生クラス
- サブクラス
元:
class YourClass(Object):
継承されたクラス
- 親クラス
- 基本クラス
- スーパークラス
あるクラスは別のクラスから継承できます-クラスの属性は継承されます-特に、そのメソッドは継承されます-これは、継承(子)クラスのインスタンスが継承(親)クラスの属性にアクセスできることを意味します
インスタンス->クラス->次に継承されたクラス
を使用して
import inspect
inspect.getmro(MyClass)
Python内の階層が表示されます。