Python >> Tutoriel Python >  >> Python

Méthode magique Python __invert__()

Syntaxe

object.__invert__(self)

Le Python __invert__() la méthode implémente l'opération arithmétique unaire au niveau du bit NOT ~ . Ainsi, lorsque vous appelez le ~x , Python appellera en interne x.__invert__() pour obtenir l'objet inversé. Si la méthode n'est pas implémentée, 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.

Arrière-plan au niveau du bit NON ~

Le NON bit à bit de Python opérateur ~x inverse chaque bit de la représentation binaire de l'entier x de sorte que 0 devient 1 et 1 devient 0. Sémantiquement, cela revient à calculer ~x == -x-1 . Par exemple, l'expression NOT au niveau du bit ~0 devient -1 , ~9 devient -10 , et ~32 devient -33 .

Exemple personnalisé __invert__()

Dans l'exemple minimal suivant, vous créez une classe personnalisée Data et écrasez le __invert__() méthode magique afin qu'elle renvoie une chaîne factice lors de la tentative de calcul de l'opération NOT au niveau du bit.

class Data:
        
    def __invert__(self):
        return 'finxter'


x = Data()
print(~x)
# finxter

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

TypeError :mauvais type d'opérande pour unaire ~ :'…'

Considérez l'extrait de code suivant où vous essayez de calculer l'opération NOT au niveau du bit sur des objets personnalisés sans définir la méthode dunder __invert__() :

class Data:
    pass


x = Data()
print(~x)

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>
    print(~x)
TypeError: bad operand type for unary ~: 'Data'

La raison de cette erreur est que le __invert__() La méthode n'a jamais été définie et n'est pas définie pour un objet personnalisé par défaut. Donc, pour résoudre le TypeError: bad operand type for unary ~ , vous devez fournir le __invert__(self) méthode dans votre définition de classe comme indiqué précédemment :

class Data:
        
    def __invert__(self):
        return 'finxter'


x = Data()
print(~x)
# finxter

Références :

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