Há ótimas respostas aqui e, antes de dar as minhas, gostaria de destacar algumas das gemas (sem trocadilhos de rubi) que li aqui.
- O Python não é uma linguagem pura de OOP - é uma linguagem de múltiplos paradigmas de propósito geral que permite ao programador usar o paradigma com o qual se sente mais confortável e / ou o paradigma mais adequado para sua solução.
- Python tem funções de primeira classe, então
len
é realmente um objeto. Ruby, por outro lado, não possui funções de primeira classe. Portanto, o len
objeto de função possui seus próprios métodos que você pode inspecionar executando dir(len)
.
Se você não gosta da maneira como isso funciona em seu próprio código, é trivial reimplementar os contêineres usando seu método preferido (veja o exemplo abaixo).
>>> 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
. Eles acham que é mais fácil forçar as pessoas a implementar.__len__
do que forçar as pessoas a implementar.len()
. É a mesma coisa, e um parece muito mais limpo. Se o idioma tiver um POO__len__
, o que o mundo está fazendolen(..)