Здесь есть несколько отличных ответов, и поэтому, прежде чем я дам свой собственный, я хотел бы выделить несколько драгоценных камней (без рубиновой игры слов), которые я прочитал здесь.
- Python не является чистым языком ООП - это универсальный, многопарадигмальный язык, который позволяет программисту использовать парадигму, с которой он наиболее удобен, и / или парадигму, которая лучше всего подходит для их решения.
- Python имеет первоклассные функции, поэтому
len
на самом деле является объектом. С другой стороны, в Ruby нет функций первого класса. Таким образом, объект функции len
имеет собственные методы, которые вы можете проверить, запустив dir(len)
.
Если вам не нравится, как это работает в вашем собственном коде, для вас тривиально повторно реализовать контейнеры, используя предпочитаемый вами метод (см. Пример ниже).
>>> class List(list):
... def len(self):
... return len(self)
...
>>> class Dict(dict):
... def len(self):
... return len(self)
...
>>> class Tuple(tuple):
... def len(self):
... return len(self)
...
>>> class Set(set):
... def len(self):
... return len(self)
...
>>> my_list = List([1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'])
>>> my_dict = Dict({'key': 'value', 'site': 'stackoverflow'})
>>> my_set = Set({1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'})
>>> my_tuple = Tuple((1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'))
>>> my_containers = Tuple((my_list, my_dict, my_set, my_tuple))
>>>
>>> for container in my_containers:
... print container.len()
...
15
2
15
15
person
Charles Addis
schedule
28.02.2017
len(someObj)
не вызывает функциюsomeObj
__len__
? tl; dr Да, поэтому всегда используйтеlen()
вместо__len__()
. - person wjandrea   schedule 04.07.2020