Почему Python кодирует использование len () функция вместо метода длины?

195
задан smci 24 August 2018 в 16:53
поделиться

5 ответов

Строки действительно имеют метод длины: __len__()

протокол в Python должен реализовать этот метод на объектах, которые имеют длину и используют встроенное len() функция, которая называет его для Вас, подобным способу, которым Вы реализовали бы __iter__() и использовали бы встроенное iter() функция (или назовите метод негласно для Вас) на объектах, которые повторяемы.

См. Эмулировать контейнерные типы для получения дополнительной информации.

Вот хорошее чтение на предмет протоколов в Python: Python и Принцип Наименьшего количества Удивления

170
ответ дан Jonny Buchanan 23 November 2019 в 05:22
поделиться

Ответ Jim на этот вопрос может помочь; я копирую его здесь. Заключение в кавычки Guido van Rossum:

, В первую очередь, я выбрал len (x) по x.len () по причинам HCI (определение _ _ len_ _ (), прибыл намного позже). Существует две переплетенных причины на самом деле, оба HCI:

(a) Для некоторых операций, префиксная нотация просто читает лучше, чем постфикс — префикс (и инфикс!) операции имеют давнюю традицию в математике, которой нравятся нотации, где зрительный ряд помогает математику, думающему о проблеме. Сравните легкое, с которым мы переписываем формулу как x* (a+b) в x + x b к неуклюжести выполнения того же самого с помощью необработанной нотации OO.

(b), Когда я считал код, который говорит len (x), я знаю, что это просит длину чего-то. Это говорит мне две вещи: результатом является целое число, и аргументом является некоторый контейнер. Наоборот, когда я считал x.len (), я должен уже знать, что x является некоторым контейнером, реализовывая интерфейс или наследовавшись классу, который имеет стандарт len (). Засвидетельствуйте беспорядок, который мы иногда имеем, когда класс, который не реализует отображение, имеет получать () или ключи () метод или что-то, что isn’t файл имеет запись () метод.

Высказывание того же самого в другом отношении, я рассматриваю ‘len†˜ как встроенную операцию. I’d очень не хотят потерять это./†¦ /

86
ответ дан Community 23 November 2019 в 05:22
поделиться

Существует len метод:

>>> a = 'a string of some length'
>>> a.__len__()
23
>>> a.__len__
<method-wrapper '__len__' of str object at 0x02005650>
37
ответ дан unmounted 23 November 2019 в 05:22
поделиться
met% python -c 'import this' | grep 'only one'
There should be one-- and preferably only one --obvious way to do it.
12
ответ дан Alex Coventry 23 November 2019 в 05:22
поделиться

Это не делает?

>>> "abc".__len__()
3
-1
ответ дан Nick Stinemates 23 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: