Хотя причина в основном историческая, в Python len
есть некоторые особенности, которые делают целесообразным использование функции вместо метода.
Некоторые операции в Python реализованы как методы, например list.index
и dict.append
, тогда как другие реализованы как вызываемые объекты и магические методы, например str
, iter
и reversed
. Эти две группы достаточно различаются, поэтому оправдан различный подход:
- Они распространены.
str
, int
и друзья - типы. Имеет смысл вызвать конструктор.
- Реализация отличается от вызова функции. Например,
iter
может вызвать __getitem__
, если __iter__
недоступен, и поддерживает дополнительные аргументы, которые не подходят для вызова метода. По той же причине it.next()
было изменено на next(it)
в последних версиях Python — это имеет больше смысла.
- Некоторые из них являются близкими родственниками операторов. Есть синтаксис для вызова
__iter__
и __next__
— он называется циклом for
. Для согласованности функция лучше. И это делает его лучше для определенных оптимизаций.
- Некоторые функции просто слишком похожи на остальные —
repr
действует так же, как str
. Наличие str(x)
против x.repr()
сбивает с толку.
- Некоторые из них редко используют фактический метод реализации, например
isinstance
.
- Некоторые из них являются настоящими операторами,
getattr(x, 'a')
— еще один способ выполнения x.a
, а getattr
обладает многими из вышеупомянутых качеств.
Лично я называю первую группу методоподобной, а вторую группу оператороподобной. Это не очень хорошее различие, но я надеюсь, что оно как-то поможет.
Сказав это, len
точно не вписывается во вторую группу. Он более близок к операциям из первого, с той лишь разницей, что встречается гораздо чаще, чем почти любой из них. Но единственное, что он делает, это вызывает __len__
, и это очень близко к L.index
. Однако есть некоторые отличия. Например, __len__
может быть вызван для реализации других функций, таких как bool
, если бы метод назывался len
, вы могли бы сломать bool(x)
с помощью пользовательского метода len
, который делает совершенно другое.
Короче говоря, у вас есть набор очень общих функций, которые могут быть реализованы классами, к которым можно получить доступ через оператор, через специальную функцию (которая обычно делает больше, чем реализация, как это сделал бы оператор), во время создания объекта, и все они разделяют некоторые общие черты. Все остальное - метод. И len
является своего рода исключением из этого правила.
person
Rosh Oxymoron
schedule
05.03.2011
len()
илиreversed()
применяется ко многим типам объектов, но такой метод, какappend()
, применяется только к последовательностям и т. д. - person Grant Paul   schedule 17.04.2010