La respuesta corta: 1) compatibilidad con versiones anteriores y 2) no hay suficiente diferencia para que realmente importe. Para una explicación más detallada, sigue leyendo.
El enfoque idiomático de Python para tales operaciones es métodos especiales que no están destinados a ser llamados directamente. Por ejemplo, para que x + y
funcione para su propia clase, escriba un método __add__
.Para asegurarse de que int(spam)
convierta correctamente su clase personalizada, escriba un método __int__
. Para asegurarse de que len(foo)
haga algo sensato, escriba un método __len__
.
Así es como siempre han sido las cosas con Python, y creo que tiene mucho sentido para algunas cosas. En particular, esto parece una forma sensata de implementar la sobrecarga del operador. En cuanto al resto, los diferentes idiomas no están de acuerdo; en Ruby convertirías algo a un entero llamando directamente al spam.to_i
en lugar de decir int(spam)
.
Tiene razón en que Python es un lenguaje extremadamente orientado a objetos y que tener que llamar a una función externa en un objeto para obtener su longitud parece extraño. Por otro lado, len(silly_walks)
no es más oneroso que silly_walks.len()
, y Guido ha dicho que realmente lo prefiere (http://mail.python.org/pipermail/python-3000/2006-November/004643.html).
Las funciones no se heredan. Los métodos son ¿De qué objeto 'len' método le gustaría heredar? – tzot
Esto es irrelevante ya que len solo llama al método __len__, por lo que los mismos problemas de herencia seguirán siendo válidos. –
@Eli Se refiere al método '__len__' - ASÍ, interpretó los doble guión bajo en negrita. =) – MatrixFrog