Jest tu kilka świetnych odpowiedzi, więc zanim dam własne, chciałbym podkreślić kilka klejnotów (nie zamierzam używać ruby punka), które przeczytałem tutaj.
- Python nie jest czystym językiem OOP - jest to uniwersalny język wieloparadygmowy, który pozwala programiście korzystać z paradygmatu, w którym są najwygodniejsi i / lub paradygmatu, który najlepiej pasuje do ich rozwiązania.
- Python ma pierwszorzędne funkcje, więc w
len
rzeczywistości jest obiektem. Z drugiej strony Ruby nie ma funkcji pierwszej klasy. Tak więc len
przedmiotem funkcja ma własne metody, które można sprawdzić, uruchamiając dir(len)
.
Jeśli nie podoba ci się sposób, w jaki działa to we własnym kodzie, to jest trywialne, aby ponownie wdrożyć kontenery przy użyciu preferowanej metody (patrz przykład poniżej).
>>> 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
. Uważają, że łatwiej jest zmusić ludzi do wdrożenia.__len__
niż zmusić ludzi do wdrożenia.len()
. To to samo i wygląda na znacznie czystszego. Jeśli język ma mieć OOP__len__
, co na świecie ma senslen(..)