Python の join が str のメソッドになっている理由

それにしても、Pythonのjoin()はなんでArray#joinでなくてString#joinなんだ?

これ、理由は明解で、「join メソッドは文字列の処理だから」です。

This method can be used with any argument which obeys the rules for sequence objects, including any new classes you might define yourself.

弾さんのところのコメントに出てきている、「General Python FAQ - 1.4.8 Why is join() a string method instead of a list or tuple method?」で全てなわけですが、str.join (unicode.join) は 任意の sequence に適用できて、

", ".join("abc")

とか

", ".join(str(x * x) for x in range(10))

とかできるのを忘れちゃいけないと思うなぁ。
あと、関係ないことですが。

文字列の処理をするメソッドを、どんなものでも入る Array Class のメソッドとしてはやすなんてとんでもない!

あえて、Perl/Ruby での呼び方にあわせたのかも知れないけど、Python の場合は list/tuple、もっと generic に言えば sequence。array.array は決まった型しか入らない。