234 votes

Y a-t-il une raison chaînes Python don ' t ont une méthode de longueur de chaîne ?

Je sais que python a len() fonction qui est utilisée pour déterminer la taille d'une chaîne de caractères, mais je me demandais pourquoi ce n'est pas une méthode de l'objet string.

Mise à jour

Ok, j'ai réalisé que j'étais trop trompé. __len__() est en fait une méthode d'un objet de type string. Il semble juste bizarre de voir le code orienté objet en Python à l'aide de la fonction len sur des objets string. En outre, il est aussi bizarre de voir __len__ comme son nom au lieu de simplement len.

197voto

insin Points 19509

Les chaînes ont une longueur de méthode: __len__()

Le protocole en Python est de mettre en œuvre cette méthode sur des objets qui ont une longueur et utiliser le haut- len() de la fonction qui l'appelle pour vous, de la même façon, vous pouvez implémenter __iter__() et utiliser le haut- iter() de la fonction (ou d'avoir la méthode appelée dans les coulisses pour vous) sur des objets qui sont itératif.

Voir Émulant les types de conteneurs pour plus d'informations.

Voici une bonne lecture sur le sujet des protocoles en Python: Python et le Principe de moindre Étonnement

110voto

Federico A. Ramponi Points 23106

Jim, la réponse à cette question peut aider; je le recopie ici. Citant Guido van Rossum:

Tout d'abord, j'ai choisi len(x) sur x.len() pour HCI raisons (def __len__() est venu beaucoup plus tard). Il y a deux entrelacés raisons en fait, les deux HCI:

(a) Pour certaines opérations, le préfixe de la notation juste se lit mieux que le suffixe - préfixe (et infix!) les opérations ont une longue tradition dans les mathématiques, qui aime les notations où les visuels aider le mathématicien penser à un problème. Comparer la facilité avec laquelle nous réécrire une formule comme x*(a+b) x* + x*b à la maladresse de faire la même chose à l'aide d'un raw OO notation.

(b) Quand j'ai lu le code qui dit len(x) je sais qu'il est demandé pour la longueur de quelque chose. Cela me dit deux choses: le résultat est un entier, et l'argument est une sorte de conteneur. Au contraire, quand j'ai lu x.len(), je sais déjà que x est une sorte de conteneur mise en œuvre d'une interface ou d'hériter d'une classe qui a une norme len(). Témoin de la confusion, nous ont de temps en temps quand une classe qui n'est pas mise en œuvre d'une cartographie a un get() ou la méthode keys (), ou quelque chose qui n'est pas un fichier a une méthode write ().

Dire la même chose d'une autre manière, je vois ‘len‘ comme un construit-dans l'opération. Je déteste perdre. /.../

40voto

Luciano Ramalho Points 825

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).

36voto

unmounted Points 10968

Il y a une `` méthode :

12voto

Alex Coventry Points 11090
met% python -c 'import this' | grep 'only one'
There should be one-- and preferably only one --obvious way to do it.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X