Pythonのクラスの挙動を調べる:class構文の外からクラスにメンバ関数を追加(1)

[]
2009年6月18日 15:41

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は十分良い言語ですよと言ってみる

[]
2009年4月10日 01:29

 『 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は堅い企業ユースでも使い物になると思っている。

さくらのサーバーがアップデート

[]
2009年4月7日 01:49

 このblogをホスティングしているさくらのサーバーがアップデート。FreeBSD 7.1へのアップデートということで、多少ユーザーランドが変わっている模様。とりあえずjvim2がjvim3になっていたのでエイリアスを修正。あとはPythonがやっと2.5系に。これでやっとバージョン違いによるsqlite3とかハッシュ関数とかの相違を気にしなくて良くなりますな。