Краткий ответ: 1) обратная совместимость и 2) разницы недостаточно, чтобы она действительно имела значение. Для более подробного объяснения читайте дальше.
Идиоматический подход Python к таким операциям - это специальные методы, которые не предназначены для непосредственного вызова. Например, чтобы x + y
работал для вашего собственного класса, вы пишете метод __add__
. Чтобы убедиться, что int(spam)
правильно преобразовывает ваш пользовательский класс, напишите метод __int__
. Чтобы убедиться, что len(foo)
делает что-то разумное, напишите метод __len__
.
Так было всегда с Python, и я думаю, что это имеет смысл для некоторых вещей. В частности, это кажется разумным способом реализации перегрузки операторов. В остальном, разные языки не согласны; в Ruby вы конвертируете что-то в целое число, вызывая spam.to_i
напрямую, а не int(spam)
.
Вы правы, что Python является чрезвычайно объектно-ориентированным языком и что необходимость вызывать внешнюю функцию для объекта, чтобы получить его длину, кажется странной. С другой стороны, len(silly_walks)
не более обременителен, чем silly_walks.len()
, и Гвидо сказал, что он действительно предпочитает это (http://mail.python.org/pipermail/python-3000/2006-November/004643.html).