作者: 機械伯爵
日時: 2008/1/16(14:04)
 以下、日本のウィキペディアの「Python」の説明の中の記述を引用

<引用>
 多くのオブジェクト指向言語と同様、Pythonではユーザが新しく自分の型を定
義することも可能である。
 ただしPythonではJavaなどの言語よりも型の扱いがルーズであり、既存の型を
拡張した新しい型を定義する場合、Pythonではまったく独立した新しいクラスを
作成し、模倣したい型と同じメソッドさえ揃えればよい。
 例えば、ファイルのようにふるまう新しいデータ型を定義して既存のファイル
型の代わりに使いたい場合、JavaではInputStreamなどのクラスを継承しなけれ
ばコンパイルエラーとなる。
 しかしPythonではそのような型のチェック機構が存在しないため、新たなクラ
スをつくり、そこにreadやseek、closeなど既存のファイル型に対して行うであ
ろう操作と同じメソッドを提供してさえやれば、そのクラスをファイルとして扱
うことができるのである。
 このような型の拡張方法はダック・タイピング(duck typing)と呼ばれる。
 なお、この方法では型の安全性を静的にチェックできないため、ダック・タイ
ピングを用いたPythonプログラムは実行時に型エラー(多くの場合これは「メソ
ッドが定義されていない」というエラーとなって現れる)が発生する危険性があ
る。
 したがって新しい型を設計する際には、Python プログラマは(Javaなどより
も)多少は注意深くなる必要がある。
</引用>

 振る舞いが予想できないようなクラスは、素直に継承して拡張あるいは隠蔽す
ればよかろうに、なんでわざわざダックタイピング的特徴で新しいクラスを実装
せにゃならんのか、理解に苦しみます。

 ダック・タイピングが便利なのは、C++なら仮想クラス、Javaならインターフ
ェイスを使わなければならない場面であって、継承が便利な場合には、素直に継
承すべきだと私は思うし、仮想クラスやインターフェイスを使わなきゃならない
場合は、C++やJavaでもやっぱり気をつけなきゃならないだろうと思うんです
が……

 あんまり不可解なんで、ノートに「これ、何の意味があるんですか?」的なコ
メント書いておきましたが、反応が無い場合、本文を編集しようかと思います。

※そんなに型チェックしたけりゃ、isinstance関数使えばいーじゃないか。

 ……以前私が投稿した部分を「客観性が無い」とか言って編集された私怨とか
言わないように(まぁ、その編集した当人が書いた記述なんだけどさ……偶然、
偶然)

 /機械伯爵/