web-dev-qa-db-ja.com

特定のクラスの階層内のすべての基本クラスをリストしますか?

クラスFoonew-style クラスであるかどうか)が与えられた場合、基本クラスをall生成する方法-継承階層のどこか-it issubclass of?

120

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'>)
174
Jochen Ritzel

__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>]
38
Crescent Fresh

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

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
30
Ned Batchelder

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

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

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

それが役に立てば幸い!

21
mandel

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

例:

class MyClass(YourClass):

継承クラス

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

例:

class YourClass(Object):

継承されたクラス

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

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

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

を使用して

import inspect
inspect.getmro(MyClass)

python内で階層を表示します。

2
Carson

python 3.7では、inspectをインポートする必要はありません。type.mroは結果を表示します。

>>> class A:
...   pass
... 
>>> class B(A):
...   pass
... 
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>

in python 3.xすべてのクラスがベースオブジェクトクラスから継承することに注意してください。

0
Serjik

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

_
0
YaOzI