メソッドは属性表記を使って呼び出される関数です。メソッドには二つの 種類があります: (リストへのappend()のような) 組み込みメソッド と、クラスインスタンスのメソッドです。組み込みメソッドはそれをサポート する型と一緒に記述されています。
実装では、クラスインスタンスのメソッドに 2 つの読み込み専用の属性
を追加しています: m.im_self
はメソッドが操作するオブジェクト
で、m.im_func
はメソッドを実装している関数です。
m(arg-1, arg-2, ..., arg-n)
の呼び出しは、m.im_func(m.im_self, arg-1,
arg-2, ..., arg-n)
の呼び出しと完全に等価です。
クラスインスタンスメソッドには、 メソッドがインスタンスからアクセス
されるかクラスからアクセスされるかによって、それぞれバインド
または 非バインド があります。メソッドが非バインドメソッドの
場合、im_self
属性は None
になるため、呼び出す際
には self
オブジェクトを明示的に第一引数として指定しなければ
なりません。この場合、self
は非バインドメソッドのクラス
(サブクラス) のインスタンスでなければならず、そうでなければ
TypeError が送出されます。
関数オブジェクトと同じく、メソッドオブジェクトは任意の属性を取得
できます。しかし、メソッド属性は実際には背後の関数オブジェクト
(meth.im_func
) に記憶されているので、バインド、ヒバインド
メソッドへのメソッド属性の設定は許されていません。
メソッド属性の設定を試みると TypeError が送出されます。
メソッド属性を設定するためには、その背後の関数オブジェクトで
明示的に:
class C: def method(self): pass c = C() c.method.im_func.whoami = 'my name is c'
のように設定しなければなりません。 詳しくは Python リファレンスマニュアル を読んで下さい。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。