オブジェクトの情報を探る(6) - クラスオブジェクトとメソッドオブジェクト
【 目次 】
クラスオブジェクトの属性
属性 | 説明 |
---|---|
__doc__ | ドキュメント文字列 |
__module__ | クラスを定義しているモジュールの名前 |
クラスオブジェクトについても「クラスとインスタンスの情報を取得する - 愚鈍人」で既に述べた。
ここではinspectモジュールで定義されているクラスオブジェクトに関する関数に的を絞って述べる事にする。
getmro関数 - メソッドを探す優先順位順を示すクラスのタプルを取得する。
mroはメソッド解決順序。
多重継承されたクラスに同名のメソッドが存在した場合に、どのクラスに実装されているメソッドが実行されるかの優先順位順を示す
getmro関数はメソッドを探す優先順位順を示すクラスのタプルを返す。
以下の例は菱形継承問題のpythonにおける優先順を表示する。
class A(object): pass class B(A): pass class C(A): pass class D(B, C): pass import inspect for i, cls in enumerate(inspect.getmro(D), 1) : print i, cls.__name__
実行結果
1 D 2 B 3 C 4 A 5 object
getclasstree関数 - リストで指定したクラスのクラス階層を取得
公式ドキュメント によると
リストで指定したクラスの継承関係から、ネストしたリストを作成します。ネストしたリストには、直前の要素から派生したクラスが格納されます。各要素は長さ2のタプルで、クラスと基底クラスのタプルを格納しています。 unique が真の場合、各クラスは戻り値のリスト内に一つだけしか格納されません。真でなければ、多重継承を利用したクラスとその派生クラスは複数回格納される場合があります。
意味不明?
クラスの継承関係を調べるのにきっと何か役に立つ関数だろうと思って調べてみたが結局、何の役に立つのかよくわからなかった。
単に私がタコなだけなのか?
参考までに、getclasstree関数の出力する内容について調べた結果を以下のページに残しておく。
結論としては、クラスの継承関係を調べるなら、この関数をわざわざ使うより特殊属性__class__や__bases__を使って自分でロジックを組んだ方が楽に思える。
class MyClsA(object): pass class MyClsAS(MyClsA): pass class MyClsASS(MyClsAS): pass class MyClsASSS(MyClsASS): pass class MyClsB(object): pass class MyClsABS(MyClsA,MyClsB): pass class MyClsAS2(MyClsA): pass def print_classtree(cls, indent=0): print ' ' * indent, cls.__name__ for base_cls in cls.__bases__: print_classtree(base_cls, indent + 2) for cls in (MyClsABS, MyClsASSS): print cls.__name__.rjust( 40, '=' ) print_classtree(cls)
実行結果
================================MyClsABS MyClsABS MyClsA object MyClsB object ===============================MyClsASSS MyClsASSS MyClsASS MyClsAS MyClsA object
メソッドオブジェクトの属性
メソッドオブジェクトについても「メソッドオブジェクト(2) - 愚鈍人」などで既に述べた。
ここでは、公式ドキュメントの表よりメソッドオブジェクトの部分をとりだして以下に引用するだけにとどめる。
属性 | 説明 |
---|---|
__doc__ | ドキュメント文字列 |
__name__ | メソッドが定義された時の名前 |
im_class | メソッドを呼び出すために必要なクラスオブジェクト |
im_func または __func__ | メソッドを実装している関数オブジェクト |
im_self または __self__ | メソッドに結合しているインスタンス、または one |