作者: 機械伯爵
日時: 2003/3/7(23:18)
 機械です。

 「簡単明瞭」が売りだったはずのPythonの挙動が、最
近怪しさを増しているようで、どーも恐いです。

 組み込みタイプが継承できるようになり、組み込みタ
イプの拡張が容易になった、ということは聞いていたの
ですが、関数にフィールドが組み込めるなんてさすがに
知りませんでした。

>>> def f():
...   f.s += 1
...   return f.s
... 
>>> f.s = 5
>>> f()
6
>>> f()
7
>>> f()
8

 多分、噂に聞くクロージャを実装するために、こんな
ことが出来るようになったんだとは思いますが・・・う
〜む。

※ちなみに、Schemeを勉強してますが、未だにクロージ
  ャの正確な意味は理解できてません。

 なお、おさらいですが、Pythonクラスはメタクラスプ
ロトコル(この言葉も、Smalltalkでの聞きかじりなので
正確じゃないかもなぁ)を備えているので、以下のよう
なことが可能です(この機能は、ずいぶん前からありまし
た)

>>> class C:pass
...
>>> i = C()
>>> def f1(s):return s.f * 5
...
>>> C.m1 = f1
>>> C.m2 = lambda s : s.f * 5
>>> i.f = 10
>>> i.m1()
50
>>> i.m2()
50

 クラスメソッドの場合、第一引数はインスタンスが自
動的に代入されます。

 しかし、インスタンスメソッドは「ただの関数」であ
り、自分自身へのポインタを持ちません。

<上のつづき・・・>
>>> i.m3 = f1
>>> i.m3()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: f1() takes exactly 1 argument (0 given)
>>> i.m3(i)
50

 理解してしまえば簡単ですが、「なぜ」と問われると
不思議です。

 暗黙のselfキーワードというものが存在しないかわり
に、暗黙の引数代入が行われるというのは、どっちが簡
単なのかは迷うところです。

 なおこのことから、defは単なる構造体として使うこと
も可能のようですが、それに何の意味があるかは疑問で
す(クラスを定義しない分、楽とか・・・)

 Python言語が進化中の言語というのが、なんだか実感
できますが・・・希望としてはあまり複雑にならないで
ほしいなぁ(今ぐらいならまだ良いんですが・・・)