質問

Python コードがある場合

class A():
    pass
class B():
    pass
class C(A, B):
    pass

そして私には授業があります C, 、スーパークラス化されたものを反復処理する方法はありますか(A そして B)?疑似コードのようなもの:

>>> magicGetSuperClasses(C)
(<type 'A'>, <type 'B'>)

1つの解決策と思われるのは、 検査モジュール そして getclasstree 関数。

def magicGetSuperClasses(cls):
    return [o[0] for o in inspect.getclasstree([cls]) if type(o[0]) == type]

しかし、これは目標を達成するための「Python 的」な方法なのでしょうか?

役に立ちましたか?

解決

C.__bases__ はスーパークラスの配列なので、次のように仮説関数を実装できます。

def magicGetSuperClasses(cls):
  return cls.__bases__

しかし、参照するだけの方が簡単だと思います cls.__bases__ ほとんどの場合、直接。

他のヒント

@ジョン:スニペットは機能しません -- を返しています クラス 基本クラス (メタクラスとも呼ばれます) の一部。あなたは本当にただ欲しいのです cls.__bases__:

class A: pass
class B: pass
class C(A, B): pass

c = C() # Instance

assert C.__bases__ == (A, B) # Works
assert c.__class__.__bases__ == (A, B) # Works

def magicGetSuperClasses(clz):
  return tuple([base.__class__ for base in clz.__bases__])

assert magicGetSuperClasses(C) == (A, B) # Fails

また、Python 2.4 以降を使用している場合は、次を使用できます。 ジェネレータ式 ([] 経由) リストを作成してから、それをタプルに変換する代わりに ([] 経由) tuple)。例えば:

def get_base_metaclasses(cls):
    """Returns the metaclass of all the base classes of cls."""
    return tuple(base.__class__ for base in clz.__bases__)

これはややわかりにくい例ですが、genexp は一般に簡単でクールです。:)

検査モジュールは良いスタートでした。 ゲットムロ 関数:

cls を含むクラス cls の基本クラスのタプルをメソッド解決順に返します。このタプル内に複数回出現するクラスはありません。...

>>> class A: pass
>>> class B: pass
>>> class C(A, B): pass
>>> import inspect
>>> inspect.getmro(C)[1:]
(<class __main__.A at 0x8c59f2c>, <class __main__.B at 0x8c59f5c>)

返されたタプルの最初の要素は次のとおりです。 C, 、無視して構いません。

super() が使用できるクラスを呼び出す順序を知る必要がある場合 C.__mro__ そして必要ありません inspect したがって。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top