Python >> Tutoriel Python >  >> Python

Méthode magique Python __bytes__()

Syntaxe

object.__bytes__(self)

Le Python __bytes__() la méthode implémente le bytes() intégré fonction. Ainsi, lorsque vous appelez bytes(x) , Python tente d'appeler x.__bytes__() . Si la valeur de retour n'est pas un objet Bytes ou le x.__bytes__() la méthode n'est pas définie pour un objet sur lequel vous appelez bytes(x) , Python lèvera un TypeError .

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.

Octets de fond()

bytes(x) intégré de Python la fonction crée un bytes immuable objet initialisé comme défini dans l'argument de la fonction x .

Un objet octets est comme une chaîne mais il n'utilise que des caractères d'octets constitués d'une séquence d'entiers 8 bits dans la plage 0<=x<256 .

L'objet byte renvoyé est immuable :vous ne pouvez pas le modifier après sa création. Si vous envisagez de modifier le contenu, utilisez le bytearray() méthode pour créer un bytearray mutable objet.

Pour comprendre en détail cette opération, n'hésitez pas à relire notre tutoriel ou regarder la vidéo suivante :

Exemple personnalisé __bytes__()

Dans l'exemple suivant, vous créez une classe personnalisée Data et écrasez le __bytes__() méthode magique pour qu'elle renvoie un objet Bytes b'42' en essayant d'appeler le bytes(x) sur un Data personnalisé objet.

class Data:
    def __bytes__(self):
        return b'42'


x = Data()
res = bytes(x)

print(res)
# ... b'42' ...

TypeError :impossible de convertir l'objet '...' en octets

Si vous n'aviez pas défini le __bytes__() méthode, Python aurait soulevé un TypeError :

class Data:
    pass


x = Data()
res = bytes(x)

print(res)

Sortie :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 6, in <module>
    res = bytes(x)
TypeError: cannot convert 'Data' object to bytes

Pour corriger cette erreur, définissez le x.__bytes__() méthode pour un objet x avant d'appeler le bytes(x) intégré méthode passant cet objet en argument :

class Data:
    def __bytes__(self):
        return b'42'


x = Data()
res = bytes(x)

print(res)
# ... b'42' ...

TypeError :__bool__ doit renvoyer bool, renvoyé …

Considérez l'extrait de code suivant où vous essayez de renvoyer un entier, c'est-à-dire un objet non octet dans la méthode dunder __bytes__() :

class Data:
    def __bytes__(self):
        return 42


x = Data()
res = bytes(x)

print(res)

L'exécution de cette opération entraîne le message d'erreur suivant sur mon ordinateur :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 7, in <module>
    res = bytes(x)
TypeError: __bytes__ returned non-bytes (type int)

La raison du TypeError: __bytes__ returned non-bytes (type ...) l'erreur est que le __bytes__() La méthode doit renvoyer un objet Bytes. Ainsi, pour résoudre l'erreur, renvoyez un objet Bytes, par exemple, en utilisant la syntaxe b'...' dans votre définition de méthode comme indiqué précédemment :

class Data:
    def __bytes__(self):
        return b'42'


x = Data()
res = bytes(x)

print(res)
# ... b'42' ...

Références :

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