167

Fooクラス(新しいスタイルのクラスであるかどうかに関係なく)が与えられた場合、継承階層のどこかにあるすべての基本クラスをどのように生成しますissubclassか?

4

7 に答える 7

224

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'>)
于 2009-09-09T20:28:21.327 に答える
49

基本クラスのタプルを含む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>]
于 2009-09-09T19:48:12.130 に答える
42

inspect.getclasstree()クラスとそのベースのネストされたリストを作成します。使用法:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
于 2009-09-09T19:47:54.370 に答える
21

__bases__クラスオブジェクトのタプルを使用できます。

class A(object, B, C):
    def __init__(self):
       pass
print A.__bases__

によって返されるタプルに__bases__は、すべての基本クラスがあります。

于 2009-09-09T19:47:49.160 に答える
16

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

于 2019-07-10T07:49:24.937 に答える
15

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では、すべてのクラスが基本オブジェクトクラスを継承していることに注意してください。

于 2019-06-22T06:26:19.270 に答える
2

Jochenの答えは非常に役立ち、正しいものですが、inspectモジュールの.getmro()メソッドを使用してクラス階層を取得できるため、Pythonの継承階層が次のとおりであることを強調することも重要です。

元:

class MyClass(YourClass):

継承クラス

  • 子クラス
  • 派生クラス
  • サブクラス

元:

class YourClass(Object):

継承されたクラス

  • 親クラス
  • 基本クラス
  • スーパークラス

あるクラスは別のクラスから継承できます-クラスの属性は継承されます-特に、そのメソッドは継承されます-これは、継承(子)クラスのインスタンスが継承(親)クラスの属性にアクセスできることを意味します

インスタンス->クラス->次に継承されたクラス

を使用して

import inspect
inspect.getmro(MyClass)

Python内の階層が表示されます。

于 2018-02-02T15:38:06.133 に答える