Хоча причина переважно історична, в 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є дещо винятком із цього правила.
len()абоreversed()застосовується до багатьох типів об'єктів, але такий спосіб, як наприклад,append()стосується лише послідовностей тощо.