Тут є декілька чудових відповідей, і тому, перш ніж дати власне, я хотів би виділити декілька дорогоцінних каменів (жодних рубінових каламбурів) я не читав тут.
- Python не є чистою мовою OOP - це загальна мета, багатопарадигмальна мова, яка дозволяє програмісту використовувати парадигму, яка їм найбільше комфортна та / або парадигму, яка найкраще підходить для їх вирішення.
- 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
. Вони вважають, що легше змусити людей реалізовувати,.__len__
ніж змусити людей до реалізації.len()
. Це те саме, і один виглядає набагато чистіше. Якщо мова буде мати OOP__len__
, що у світі має сенс робитиlen(..)