Pythonのクラスの挙動を調べる:class構文の外からクラスにメンバ関数を追加(1)
Pythonのクラスの挙動を調べる:class構文の外からクラスにメンバ関数を追加(1)
Pythonでプラグイン的な機構を実装する際、あるモジュールで定義されたクラスに対し、ほかのモジュールからメンバ関数を追加できると楽しいのでは?とふと思う。
ちょっと分かりにくいが、例えばHogeというクラスがhoge.pyで定義されており、Hogeクラスのメンバ関数を追加するコードがplugin.pyで定義されている。そして、plugin.pyで定義されている機能を使いたい場合のみimport pluginすると、その機能がHogeクラスで利用できるようになる、というイメージだ。
ということで、ちょっと試してみた。
[Macintosh:~]$ python
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
# 適当な関数を定義
>>> class FooBar(object):
... def func1(self):
... print "func1!"
... def func2(self):
... print "func2!"
...
# FooBarクラスのインスタンスを作成
>>> a = FooBar()
>>> a.func1()
func1!
>>> a.func2()
func2!
# FooBarは__main___内にクラスオブジェクトして記録される
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__':
'__main__', '__doc__': None, 'a': <__main__.FooBar object at
0x2454f0>, 'FooBar': <class '__main__.FooBar'>}
>>> print FooBar
<class '__main__.FooBar'>
>>> print FooBar.__dict__
{'func2': <function func2 at 0x5e2f0>, '__module__': '__main__',
'func1': <function func1 at 0x5e2b0>, '__dict__': <attribute
'__dict__' of 'FooBar' objects>, '__weakref__': <attribute
'__weakref__' of 'FooBar' objects>, '__doc__': None}
# FooBarクラスに追加する関数を定義
>>> def add1(self):
... print "add1!"
...
# add1関数をFooBarクラスのメンバに追加
>>> FooBar.add1 = add1
# クラスを改変する前に作成したインスタンスも影響を受ける!
>>> a.add1()
add1!
>>> print FooBar.__dict__
{'func2': <function func2 at 0x5e2f0>, '__module__': '__main__',
'add1': <function add1 at 0x5e270>, 'func1': <function func1 at
0x5e2b0>, '__dict__': <attribute '__dict__' of 'FooBar' objects>,
'__weakref__': <attribute '__weakref__' of 'FooBar' objects>,
'__doc__': None}
>>>
ということで、少なくともクラスオブジェクトに対して属性を追加することで、クラスにメンバ関数を追加できることは分かりました。なるほどなるほど。
Perlは十分良い言語ですよと言ってみる
『 Perlの啓蒙と促進を目指す「Japan Perl Association」発足 』とのこと。Slashdot Japanでも、「 なぜ今Perlか – parsley の日記 」で 私はあまりPerlを仕事で使いたいとは思わない。使う必要もあまりない。道具は個人で使う分には、使い手の裁量で選べるが、組織だって使う場合は他の要素が重要視される。
とか、「 techsideでPerlネタが紹介されてた – tarna の日記 」で 省略形が多すぎ。他人のソースが読みにくい。
など、まだまだ「堅い」ものとは見られていない。その点では、企業ベースで盛り立てていくことには意義があるのだろう。
あと、前述のtarna氏の日記では、下記のような「Perlが嫌いな理由」が述べられているけど、3.は Best Practice に基づけば解決、2.も皆がBest Practiceに基づけば解決するので、大きな問題ではない(「皆が」というのは大変ではあるが)。
- プログラムは速度が命。スクリプト言語とか遅すぎる(元ゲームプログラマーなんで)
- 省略形が多すぎ。他人のソースが読みにくい。
- 省略形が多すぎて、書くときにどう書くか迷う。で、後日、自分で理解苦慮。
- Cが好き(C系の文法に慣れすぎた)
1.と4.についてはしょうがないけど、実用的な観点から言えばだいたいのケースで速度が遅くて問題になる、ということはないような気がする。以前サイズが数十MBにもなるテキストファイルの処理(正規表現マッチやソートなどを行うもの)を実行させたとき、思ったより速くて驚いたことがある。実際にデータ取って比較してみると面白いかも。
と、なんだかんだいってますが自分は Perlに愛想をつかして 「2つ以上のスクリプト言語を習得すべし」(多分弾小飼氏の言葉だったと思う。ソース失念)という教えに基づいてPythonを学んだ結果、現在ではPythonがメインの作業言語となってしまいました(汗)。でもBest Practiceに基づいたPerlは堅い企業ユースでも使い物になると思っている。
さくらのサーバーがアップデート
このblogをホスティングしているさくらのサーバーがアップデート。FreeBSD 7.1へのアップデートということで、多少ユーザーランドが変わっている模様。とりあえずjvim2がjvim3になっていたのでエイリアスを修正。あとはPythonがやっと2.5系に。これでやっとバージョン違いによるsqlite3とかハッシュ関数とかの相違を気にしなくて良くなりますな。