2008年5月19日月曜日

Python はじめの一歩

Python を試してみる」のつづき

1. Instant Hacking を読む

Python をするための環境を整えたので、次は、Python に慣れるため、

pyscripter を使いながら試してみる。

pyscripter は動作も軽く、メソッドの補完をしてくれるから、コードを書いていて心地良い。^^

 

2. Instant Hacking のメモ

  • : が、まとまりを表わすのに使われる。この記号の次の行からインデント。これに見慣れると、Ruby の end は邪魔に感じる。
  • 条件分岐における elif は 、else と文字数を揃えることにより、可読性を上げてるのかな?
  • 入力を促すのは input() 関数。
  • for ループにおいて、文字列のリストは [] を省略できるようだ。
  • for ループで、インデックスを生成するには range(1, 10) 関数を使う。ただし、中身は 1 ~ 9 までであることに注意。
  • sleep(3) 。引数は、秒数。
  • リスト操作
    • []
    • append()
    • remove() 。中身の値を引数に指定。
    • [3:5] 。インデックスが 3 ~ 4 までの要素を取り出す。
  • del で変数を削除できる。
  • クラス
    • クラスにおける、メソッドの第一引数は、そのクラスのオブジェクトを参照できるように、self など適当な引数が必要。
    • new を使わずに、クラス名() でオブジェクトを生成する

 

3. メソッドの第一引数は、なぜ必要なのか?

Instant Hacking によると、

全てのオブジェクトのメソッドは、self(またはそれに近い名前の…)と呼ばれる第1引数をもっていなければなりません。

うーん、この書き方は冗長な気がする。(@_@;)

Ruby のように、

@ 付けたらインスタンス変数になる

というように、なぜしなかったのだろうか?

「またはそれに近い」

と括弧で括られていることよりも、self はキーワードではないことがわかる。

18.3. Defining classes in Python によると、

The self parameter represents the object itself. You could of course use any other word like carrot or ego, but this would not help the reading of your code by others...

それにしても、なぜ、メソッドの第一引数 self を指定しないといけないのだろうか? Python のクラスシステム を読んだけれど、自分の知識では理解できない。Python のベース部分が関数型で、その上にオブジェクト指向の環境を構築しているため、その自然な実装として今のような形になったということだろうか?

TSpython 発言 には、

Pythonは、関数もメソッドも全て「オブジェクト」です。(...) メソッドの呼び出しには二通りあります。
class A:
  def mes0(self, n):
    self. n = n
    return self
上のようなクラスがあり、a = A()でインスタンスを作ったとすると、メソッド mes0を呼び出す方法としては…… a.mes(10) という方法と、 A.mes(a, 10) という方法が両方できます(というか、後者の略記法が前者と思った方がいいかも……)
Words on a Blog: Pythonic programming and the "self" keyword にも、同様のことが書かれている。

I think explicitly using self as the first argument is a good idea, to some extent. It's kind of quirky (I'm pretty sure you can name it whatever you want, and it would still work), but having self be in the parameter list shows C programmers (and other, maybe more inexperienced OO programmers) how instance methods basically work. They aren't some voodoo magic higgity biggity, they really just pass the object as an invisible first argument to the method. In the above case, m.printInfo() is really just shorthand for MyClass.printInfo(m). Python's explicit requirement of self as the first argument makes it so that it's clear to people what the difference between instance and static methods are (even though they're different in Python than Java, et al).

(太字は引用者による)

追記 (2011.12.7) : Python で既存のクラスを拡張 を参照。

 

4. 次に読む予定の記事

 

5. 参考