str(obj)はstringのconstructorだから不自然ではあるまい。
len(obj)はlen()の実装がオブジェクト中立だから。
__len__のかわりにlen()を定義すればよい、という意見はあるだろうが、
あらゆるclassに引き継がれる大元の基底クラスで、いたずらに公開属性は定義しないというポリシーの意義は
それはそれで理解できるのではないか。
たとえばRubyはObject classにメソッドを定義しすぎで、見通しを悪くしている。
(トップレベルでユーザが定義したメソッドまで放り込まれてしまうのはもはや笑うしかない)