組み込み関数とオブジェクト指向

http://d.hatena.ne.jp/fkino/20061110

Pythonオブジェクト指向言語なのですか?」という質問をしてみました。この辺のやりとりはやっとむさんが http://qwik.jp/minpyshakyo/8.html に書いてくださっています。どうも、この組み込み関数というのが結構曲者でありながら、もしかすると、PythonPythonたらしめているのではないか。

ひょっとして、よくある、プロパティじゃなくて組み込み関数を使うからオブジェクト指向ぽくないという指摘だろうか?

例えば、

[1,2,3].len

ではなく、

len([1,2,3])

になるというヤツだ。

このあたりの組み込み関数は、関数と言うよりも、演算子という意味合いが強い。C++のsizeof()とかと同じだ。
Pythonでは、イテレータを取り出すとか、オブジェクトを文字列に変換する(Javaで言うtoString())とかが演算子になっている。

もちろん、演算子と言っても、オーバーライド*1してオブジェクト固有の演算子の実装を用意することが出来る。C++のoperator +() のような感じに。例えば、lenやstrなら、__len__や__str__という関数をオーバーライドすることができる。

他の言語がプロパティにしているものがPython演算子だからPythonオブジェクト指向じゃないというなら、+,-,/,*といった演算子を使える時点でJava等もオブジェクト指向じゃない。.add(), .sub(), .div(), .mul() にするべき。

なんで他の言語ではプロパティになっているものが、Pythonでは演算子なのか?という経緯は知らない。
ここからは推測に過ぎないけど、Python予約語の少なさとつながるのではないだろうか?
たとえば、x.str()ではなく、str(x)が内部的にx.__str__()を呼び出すという使用にしておけば、「x.strは最初から特殊な意味を持っているから使っちゃダメ」と覚えなくて済む。「__hoge__は全部使っちゃダメ」と覚えておけば良い。

*1:オーバーロードの間違いじゃないよ

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。