home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

Python/codepiece/関数(2) 結合メソッド, 非結合メソッド

Python/codepiece/関数(2) 結合メソッド, 非結合メソッド

Python / codepiece / 関数(2) 結合メソッド, 非結合メソッド
id: 219 所有者: msakamoto-sf    作成日: 2009-03-21 21:23:50
カテゴリ: Python 

PythonにはJavaのstaticメソッドと同じような意味のメソッドは無いようです。

>>> class C(object):
...   def m1():
...     print 'static class method'
...
>>> C.m1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method m1() must be called with C instance as first argument 
 (got nothing instead)

上記エラーメッセージに"unbound method"という単語が出てきます。「非結合メソッド」と訳すようです。
エラーメッセージの内容としては、「非結合メソッド m1() はクラスCのインスタンスを第一引数に取る必要があります」(実際は指定されてないのでTypeError)という意味です。

「非結合メソッド」があれば「結合メソッド」もあります。以下のページがわかりやすく解説してありますので、まずはこちらを参照。

クラスのメソッドには次の3つの属性が設定されます。

  • im_class : クラスオブジェクト
  • im_func : 関数オブジェクト
  • im_self : 結合メソッドとしてアクセスされる場合はインスタンス、非結合メソッドとしてアクセスされる場合はNone

参考:

  • Python Library Reference (Python 2.5)
    • "3.11.4 Methods"
    • "26.10.1 Types and members"

というわけで、軽く実験してみます。

>>> class C(object): pass
...
>>> def m1(self): print 'aaa'
...
>>> m1
<function m1 at 0x00AF5CB0>

空っぽのクラスと、適当な関数を用意しました。続いて、関数をクラスのメソッドに設定します。

>>> C.m = m1
>>> C.m
<unbound method C.m1>
>>> c = C()
>>> c
<__main__.C object at 0x00AF7CB0>
>>> c.m
<bound method C.m1 of <__main__.C object at 0x00AF7CB0>>

"C.m" だと非結合メソッド、"c.m" だと結合メソッドとしてアクセスされるのが分かります。

>>> c.m.im_class, c.m.im_func, c.m.im_self
(<class '__main__.C'>, <function m1 at 0x00AF5CB0>, <__main__.C object at 0x00AF7CB0>)
>>> C.m.im_class, C.m.im_func, C.m.im_self
(<class '__main__.C'>, <function m1 at 0x00AF5CB0>, None)

非結合メソッドの方の "im_self" はドキュメントの通り、Noneになっています。

"3.11.4 Methods"にありますが、im_funcとim_selfを使えば

c.m(arg1, arg2, ...)


c.m.im_func(c.m.im_self, arg1, arg2, ...)

と書けるようです。

>>> c.m.im_func(c.m.im_self)
aaa

確かに呼べています。

以上。

なおクラスメソッドやJavaのstaticメソッドに相当する機能は、classmethod(), staticmethod() をデコレータとして使うことで実現できるようですが、それについては後日調べてみます。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2009-03-21 21:45:44
md5:9c58f69df634cedd69df78f570083a08
sha1:32cc9852ce355ee01c7438a532a8ca55ae986169
コメント
コメントを投稿するにはログインして下さい。