Aquí hay algunas respuestas excelentes, por lo que antes de dar la mía me gustaría destacar algunas de las gemas (sin intención de juego de palabras con rubí) que he leído aquí.
- Python no es un lenguaje OOP puro: es un lenguaje de paradigma múltiple de propósito general que permite al programador usar el paradigma con el que se siente más cómodo y / o el paradigma que mejor se adapta a su solución.
- Python tiene funciones de primera clase, por
len
lo que en realidad es un objeto. Ruby, por otro lado, no tiene funciones de primera clase. Por lo tanto, el len
objeto de función tiene sus propios métodos que puede inspeccionar ejecutando dir(len)
.
Si no le gusta cómo funciona esto en su propio código, es trivial volver a implementar los contenedores utilizando su método preferido (vea el ejemplo a continuación).
>>> 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
. Piensan que es más fácil obligar a las personas a implementar.__len__
que obligar a las personas a implementar.len()
. Es lo mismo, y uno se ve mucho más limpio. Si el idioma va a tener un OOP__len__
, ¿cuál es el objetivo del mundolen(..)