Python - прагматический язык программирования, и причины для len()
, являющегося функцией, а не методом str
, list
, dict
и т. Д., Прагматичны.
Встроенная функция len()
имеет дело непосредственно со встроенными типами: реализация len()
CPython фактически возвращает значение поля ob_size
в PyVarObject
C struct , которая представляет любой встроенный объект переменного размера в памяти. Это на намного быстрее, чем вызов метода - поиск атрибутов не требуется. Получение количества элементов в коллекции является обычной операцией и должно эффективно работать для таких основных и разнообразных типов, как str
, list
, array.array
и т. Д.
Однако для обеспечения согласованности при применении len(o)
к пользовательскому типу Python вызывает o.__len__()
как запасной вариант. __len__
, __abs__
и все другие специальные методы, задокументированные в Python Data Model , упрощают создание объектов, которые ведут себя как встроенные, предоставляя выразительные и высокосогласованные API, которые мы называем "Pythonic". ».
Реализуя специальные методы, ваши объекты могут поддерживать итерацию, инфиксные операторы перегрузки, управлять контекстами в блоках with
и т. Д. Модель данных можно рассматривать как способ использования самого языка Python как каркас, в котором объекты, которые вы создаете, могут быть легко интегрированы.
Вторая причина, поддерживаемая цитатами из Гвидо ван Россума, такими как , эта , заключается в том, что легче читать и писать len(s)
, чем s.len()
.
Обозначение len(s)
согласуется с унарными операторами с префиксными обозначениями, такими как abs(n)
. len()
используется гораздо чаще, чем abs()
, и заслуживает того, чтобы его было так же легко написать.
Может также быть историческая причина: в языке ABC, который предшествовал Python (и был очень влиятельным в его дизайне), был унарный оператор, записанный как #s
, что означало len(s)
.