>>> class C: ... def a(self): pass ... @staticmethod ... def b(): pass ... >>> C.a <unbound method C.a> >>> C.b <function b at 0x00DA5EF0> >>> c = C() >>> c.a <bound method C.a of <__main__.C instance at 0x00DAC508>> >>> c.b <function b at 0x00DA5EF0> >>> c.a.__self__ is c True
関数の種類 (スコア:0)
メソッドは操作対象を属性として持っているのでインスタンスから得たメソッドは束縛しなおす必要がありません。
@staticmethodを使って定義したメソッドは普通の関数と同じです。
メソッドが持っている操作対象のインスタンスはmethod.__self__で取得できます。
>>> class C:
... def a(self): pass
... @staticmethod
... def b(): pass
...
>>> C.a
<unbound method C.a>
>>> C.b
<function b at 0x00DA5EF0>
>>> c = C()
>>> c.a
<bound method C.a of <__main__.C instance at 0x00DAC508>>
>>> c.b
<function b at 0x00DA5EF0>
>>> c.a.__self__ is c
True
なおmethod.__self__は読み取り専用なので後で束縛を変更したい場合はmethod.__func__で束縛される前の関数(未束縛のメソッドではない)が取得できます。
普通の関数をメソッドにするにはnew.instancemethod関数を使います。
詳しくは言語リファレンスの3.2.標準型の階層の呼び出し可能型の項を参照して下さい。