まず前提条件として、プログラム言語には、「暗黙主義」と、「宣言主義」があると思います。いずれも筆者の解釈。
「暗黙主義」の代表は、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も面倒だろうけど、伊達や酔狂で、ああなってる訳ではないよ。筆者の言いたいのはそういうことです。