機械です。
「簡単明瞭」が売りだったはずの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言語が進化中の言語というのが、なんだか実感
できますが・・・希望としてはあまり複雑にならないで
ほしいなぁ(今ぐらいならまだ良いんですが・・・)