Mientras que la razón es sobre todo histórica, hay algunas peculiaridades en Python de len
que hacen que el uso de una función en lugar de un método apropiado .
Algunas operaciones en Python se implementan como métodos, por ejemplo list.index
y dict.append
, mientras que otros se implementan como callables y métodos mágicos, por ejemplo str
y iter
y reversed
. Los dos grupos difieren lo suficiente, por lo que el enfoque diferente está justificado:
- Son comunes.
str
, int
y sus amigos son tipos. Tiene más sentido llamar al constructor.
- La implementación difiere de la llamada de función. Por ejemplo,
iter
podría llamar al __getitem__
si __iter__
no está disponible, y es compatible con argumentos adicionales que no caben en una llamada de método. Por la misma razón, it.next()
ha sido cambiado a next(it)
en versiones recientes de Python, tiene más sentido.
- Algunos de estos son parientes cercanos de los operadores. Hay sintaxis para llamar a
__iter__
y __next__
- se llama el bucle for
. Para consistencia, una función es mejor. Y lo hace mejor para ciertas optimizaciones.
- Algunas de las funciones son simplemente demasiado similares al resto de alguna manera -
repr
actúa como str
hace. Tener str(x)
versus x.repr()
sería confuso.
- Algunos de ellos raramente usan el método de implementación real, por ejemplo
isinstance
.
- Algunos de ellos son operadores reales,
getattr(x, 'a')
es otra forma de hacer x.a
y getattr
comparte muchas de las cualidades antes mencionadas.
Personalmente llamo al primer grupo como método y al segundo grupo como operador. No es una distinción muy buena, pero espero que ayude de alguna manera.
Habiendo dicho esto, len
no encaja exactamente en el segundo grupo. Está más cerca de las operaciones en la primera, con la única diferencia de que es mucho más común que casi ninguna de ellas. Pero lo único que hace es llamar al __len__
, y está muy cerca de L.index
. Sin embargo, hay algunas diferencias. Por ejemplo, podría llamarse al __len__
para la implementación de otras características, como bool
, si el método se llamó len
, podría romper bool(x)
con el método personalizado len
que hace algo completamente diferente.
En resumen, tiene un conjunto de características muy comunes que las clases pueden implementar a las que se puede acceder a través de un operador, mediante una función especial (que normalmente hace más que la implementación, como lo haría un operador) durante la construcción del objeto. y todos ellos comparten algunos rasgos comunes. Todo el resto es un método. Y len
es algo así como una excepción a esa regla.
creo que la razón general es a) histórico y b) algo como 'len()' o 'invertida()' se aplica a muchos tipos de objetos , pero un método como 'append()' solo se aplica a secuencias, etc. –