トップ «前の日記(2006-02-15) 最新 次の日記(2006-02-17)» 編集

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2006-02-16 [長年日記]

% [雑談][PC] キーリピート間隔を短くしたらプログラミングが快適に (ひげぽん OSとか作っちゃうかMona-)

わしは大物プログラマじゃないので、どうしてそれで快適になるのか本気でわからないんだが。

% [Python] どうして Python はメソッド定義にいちいち self が必要なん?

実は Python の好きになれない部分の一つだったりするが。

class hoge:
    def func(self):
        # do something...

こういうの。 func というメソッドは実際使うときには引数の数はゼロなわけだ。 定義時の見た目と、使用時の見た目が違うのがすごく気持ち悪い。

しばらく前に誰かのブックマーク(otsune さんのだったかな)で『Python のクラスシステム』っていうページを知った。 ここには…

この文書の目的は、 Python で自前の class を作るとき、メソッドの第一引数がそのクラスのインスタンスそれ自身(一般に self と書かれる)であることの理由を説明することです。

などと書いてあって、「おお、これは」と期待したんだが……全然説明された気になれなかった。 残念。

要するにこのページの主張は、ざっくり言うと、

これらのことから、関数型言語にクラスシステムを導入する場合、 メソッドとして定義される関数はインスタンスを引数にとるのが自然であるといえます。 class のなかで定義される手続きは、 def を使って、通常の関数とまったく同様に定義されていることから、 スコープがそのクラスに限定されたものの、通常の関数と同等であるということができます。 つまり、メソッド定義の第一引数が self であるのは当然の成り行きであるということです。そうしないと、インスタンスに含まれる変数を参照することができません。

という部分が全てのようだ。 だから self が必要なんだと。 ……うーん、それは違うんじゃないの?という感じ。

言ってることが間違ってるってことじゃなく、これが理由で self を自分で書く必要があるんだ、ってのがね。 だって、上の引用部で言ってることって、オブジェクト指向言語なら普通の話じゃん。 C++ だって Ruby だって内部的にはそうなってるよ。

わしが疑問に思ってるのは、メソッド呼び出しのときに暗黙に自身のインスタンスを関数に渡すことは隠蔽してるのに、メソッド定義にインスタンスを受けるための仮引数を指定してやる必要があることは隠蔽していないのはなぜか、ってことなんだよね。 メソッド定義の場合は暗黙に仮引数を追加するようにするんじゃダメなのかということ。

例えば…

class hoge:
   def f(self):
      print "hoge"

   def g(self):
      return f

obj1 = hoge()
obj2 = hoge()
func = obj1.g()
func(obj2)

こんなコードが許されるのであれば納得いかないこともないんだけどね。 要するに、メソッドとして定義された関数も、通常の関数オブジェクトと同じように使えるならってことだけど、実際にはこんなエラーが出てダメ。

Traceback (most recent call last):
  File "./test.py", line 10, in ?
    func = obj1.g()
  File "./test.py", line 6, in g
    return f
NameError: global name 'f' is not defined

やっぱどうにも納得いかない。 誰かすっきりさせてください。

% [Python] self の話、続き

やっぱり頭の中で漠然と考えてるよりも、一旦文章にして出してしまった方がいろいろ思いつくな。 とりあえず一つ理由を思いついた。あくまでも想像だけど。

要するに実装の複雑さとのトレードオフなのかなと。 Python ってわりと組み込み用途にも力を入れてるふしがあるけど、その場合…

  • 基本部分はなるべく小さく軽くしたい

という要求があるだろう。 んで、オブジェクト指向システムを導入するにあたって、

  1. メソッド呼び出し時に暗黙にインスタンスを渡す
  2. メソッド定義時に暗黙に仮引数を追加する

という二つには、実装段階で結構違いがある感じではある。 1 は単純に、

obj.func(arg)

…を、

func(obj, arg)

…に置き換えてしまえば良いだけだが、2 の場合は def が使われている文脈が class 定義内なのかそうでないのかによって動作を変えなきゃいけないので、構文解析が複雑になると思われる。 まあ、def の代わりにメソッド定義用の予約語を一つ追加してしまえば良いのかも知れないが、それはそれで複雑さを増すし、やりたくないってのはわからなくはない。 ただ、結局は同じ def で定義しておきながらも使い方が違うわけで、追加してやっても良かったんじゃないの?と思わなくもないけど。 OCaml なんかはそういう感じだね。 メソッド定義はそのための予約語がある。

そんな感じで、好きになれるか…はともかく、なんとなく理解してあげられる気分にはなった気がしないでもないかな。(すごく微妙な言い回しだ)

% [雑談][PC] キーリピートの話その2

もしかして、カーソル移動が速くなるとかそういう話なのかな。 もしそうなら、vi 派の人間には関係無いね。

vi でキーリピート使ったカーソル移動するなんてダサすぎる。 カーソルジャンプの方法はそれこそ山ほどあるので、いかに少ないストローク数で目的の場所に移動するかを探求するのが vi 派のつとめである。 精進、精進。

お名前:
E-mail:
コメント:

トップ «前の日記(2006-02-15) 最新 次の日記(2006-02-17)» 編集

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com