Здесь есть несколько отличных ответов, и поэтому прежде чем дать свой, я бы хотел выделить несколько драгоценных камней (без рубиновой каламбуры), которые я читал здесь.
- 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
len(someObj)
не называетsomeObj
«s__len__
функции? tl; dr Да, поэтому всегда используйтеlen()
вместо__len__()
.