オブジェクトの情報を探る(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
ページのトップへ戻る