Python >> Tutoriel Python >  >> Python

Méthode magique Python __len__()

Syntaxe

object.__len__(self)

Le Python __len__ La méthode retourne un entier positif qui représente la longueur de l'objet sur lequel elle est appelée. Il implémente le len() intégré fonction. Par exemple, si vous appelez len(x) un objet x , Python appelle en interne x.__len__() pour déterminer la longueur de l'objet x .

Nous appelons cela une "méthode Dunder" pour "D ouble Sous Méthode de score" (également appelée "méthode magique" ). Pour obtenir une liste de toutes les méthodes de dunder avec des explications, consultez notre article sur la feuille de triche de dunder sur ce blog.

💡 Connaissances utiles :Si le __bool__() la méthode dunder n'est pas définie, Python renvoie en interne __len__() != 0 pour déterminer si la valeur booléenne associée à l'objet est True ou False .

Longueur d'arrière-plan()

La fonction intégrée de Python len() renvoie la longueur de la chaîne, du tableau, de la liste, du tuple, du dictionnaire ou de tout autre itérable donné.

Le type de la valeur de retour est un entier qui représente le nombre d'éléments dans cet itérable.

Avant d'en savoir plus sur le __len__() méthode dunder, jetons un coup d'œil à quelques len() de base exemples :

>>> friends = ['Alice', 'Bob', 'Carl', 'Ann']
>>> len(friends)
4
>>> friends.extend([1, 2, 3])
>>> len(friends)
7
>>> len('hello world')
11
>>> len('hi')
2
>>> len((1, 2, 3))
3
>>> len({42, 21})
2
>>> age = {'Alice': 18, 'Bob': 21}
>>> len(age)
2
>>> age['Carl'] = 33
>>> len(age)
3

Exemple personnalisé __len__()

Dans l'exemple suivant, vous créez une classe personnalisée Data et écrasez le __len__() pour qu'elle renvoie un nombre fictif.

class Data:
    def __len__(self):
        return 42


a = Data()

print(len(a))
# 42

print(bool(a))
# True    --> Because 42 != 0

Si vous n'aviez pas défini le __len__() méthode, Python aurait généré une erreur :

Implémentation par défaut de __len__()

Si vous appelez le len(x) sur un objet sur lequel le x.__len__() la méthode dunder n'est pas définie, Python lèvera un TypeError: object of type '...' has no len() . Pour corriger cette erreur, définissez simplement le __len__() méthode dans la définition de classe avant d'appeler len() sur un objet.

class Data:
    pass


a = Data()
print(len(a))

Voici le message d'erreur :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 7, in <module>
    print(len(a))
TypeError: object of type 'Data' has no len()

Quelle est la différence entre len(x) et x.__len__() ?

Le résultat de len(x) et x.__len__() est le même :les deux renvoient le nombre d'éléments de l'objet, c'est-à-dire, plus généralement, sa longueur .

Regardez cet exemple :

>>> len([1, 2, 3])
3
>>> [1, 2, 3].__len__()
3

La différence entre len(x) et x.__len__() n'est que du sucre syntaxique. La première fonction intégrée appelle la dernière méthode en interne pour implémenter le comportement correct. Il n'y a donc pas de différence sémantique entre les deux manières d'obtenir la longueur d'un objet.

Références :

  • https://docs.python.org/3/reference/datamodel.html