Хоча причина переважно історична, в 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()
стосується лише послідовностей тощо.