Python est un pragmatique du langage de programmation, et les raisons pour len()
étant une fonction et non une méthode de str
, list
, dict
etc. sont pragmatiques.
L' len()
fonction intégrée qui traite directement avec les types intégrés: le Disponible de la mise en œuvre de l' len()
renvoie en fait la valeur de l' ob_size
champ dans l' PyVarObject
C struct qui représente tout de taille variable objet intégré dans la mémoire. C'est beaucoup plus rapide que d'appeler une méthode -- aucun attribut de recherche qui doit arriver. D'obtenir le nombre d'éléments dans une collection est une opération courante et doivent fonctionner de manière efficace pour un tel de base et divers types d' str
, list
, array.array
etc.
Cependant, pour favoriser la cohérence, lors de l'application d' len(o)
d'un type défini par l'utilisateur, Python appels o.__len__()
comme une solution de repli. __len__
, __abs__
et toutes les autres méthodes décrites dans le Python, Modèle de Données permet de créer facilement des objets qui se comportent comme le built-ins, permettant à l'expressif et très cohérent Api que nous appelons "Pythonic".
Par la mise en œuvre des méthodes spéciales pour vos objets peuvent prendre en charge l'itération, la surcharge des opérateurs infixes, de gérer des contextes with
blocs etc. Vous pouvez considérer que le Modèle de Données comme un moyen d'utiliser le langage Python lui-même comme un cadre où les objets que vous créez peut être intégré de façon transparente.
Une deuxième raison, qui est appuyé par des citations de Guido van Rossum, comme cette une, c'est qu'il est plus facile à lire et à écrire len(s)
que s.len()
.
La notation len(s)
est cohérent avec les opérateurs unaires avec le préfixe de la notation, comme abs(n)
. len()
est utilisé de façon plus souvent qu' abs()
, et elle a le mérite d'être facile à écrire.
Il peut aussi être une raison historique: dans l'ABC de la langue qui a précédé Python (et a été très influent dans sa conception), il y avait un opérateur unaire écrit comme #s
ce qui signifiait len(s)
.