2010年5月2日日曜日

pythonのselfとimportの関係

別エントリでも書いた通り、pythonは、クラスメソッド宣言の中で引数にselfが必要です。

まず前提条件として、プログラム言語には、「暗黙主義」と、「宣言主義」があると思います。いずれも筆者の解釈。

「暗黙主義」の代表は、PHPでしょう。

例えば、PHPは、クオートしてない大文字の単語を、勝手に文字列定数として使用します。変数のドルを忘れてたとしたら?バグります。しかも、連想配列のキーが未定義でも、シレっとnullが戻ります。

もしくは、折角define()したのに、タイプミスしちゃって、似た文字列をキーに使っちゃったりとか。

PHPでは、クラスメソッド内部では、$thisが暗黙で使えます。自動定義と言うべきかも知れません。しかも、クラスの壁を越えられます。クラスメソッド内部から、別クラスの別メソッドを、静的メソッド的に呼び出せます。しかも$thisがそのまま伝わります。

例えば

class one { function one(){ var_dump($this); } }
class two { function two(){ one::one(); } }
$aaa = new two;
$aaa->two();


継承してませんよ。

もう変数のスコープもヘッタクリもありません。

良いか、悪いか、と言ったら、悪い。と言えましょう。

pythonは、完全に「宣言主義」です。

前述のselfは、webを眺めてみると賛否両論。C/Java育ちの人には評判が特に悪いような。しかし別エントリでも書いた通り、クラスメソッドの呼び出し方が何通りも或るので、関数宣言段階でそれを明示することは有効です。

例えば、Javaだったら、静的メソッド呼び出しを使うにはstatic宣言が必要です。pythonのselfは、その逆宣言だと思えば良いでしょう。

デコレータの鑑みるに、どうやらクラスメソッドは通常関数のwrapper的に作用しているようなので、構造上selfが必要だったのかも知れませんが、筆者は結果オーライだと思っています。

「宣言主義」は、importにも現れています。

ディレクトリ名がパッケージ名になっちゃうのも賛否両論ですが、asで別名を振れるので、特に困ることはないはず。

importも含めて、関数もクラス宣言も、オブジェクトとして変数の中に入っちゃってるので、再定義が出来てしまう、という諸刃な側面もあります。

標準状態では、ほとんど何も出来ないのでimportを沢山書きます。ブログなんかで、面倒なのだろうけど、

from ナントカ import *

をやっちゃってる人は多いですが、意図しない置き換えが、発生する可能性があります。

要するに、

  • オレのモジュールの一部が、
  • ナントカの中身で書き換わる可能性がある。


面倒なのは判るけど、モジュール階層から呼び出すべきでしょう。

selfもimportも面倒だろうけど、伊達や酔狂で、ああなってる訳ではないよ。筆者の言いたいのはそういうことです。