Python >> Tutoriel Python >  >> Python

Méthode magique Python __complex__()

Syntaxe

object.__complex__(x)

Le Python __complex__() la méthode implémente le complex() intégré fonction. Ainsi, lorsque vous appelez complex(x) , Python tente d'appeler x.__complex__() . Si la valeur de retour n'est pas un nombre complexe ou le x.__complex__() la méthode n'est pas définie pour un objet sur lequel vous appelez complex(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.

Complexe d'arrière-plan()

complex() intégré de Python La méthode renvoie un objet nombre complexe. Vous pouvez soit passer un argument de chaîne pour convertir la chaîne en nombre complexe, soit fournir les parties réelle et imaginaire pour créer un nouveau nombre complexe à partir de celles-ci.

Voici quelques exemples :

>>> complex(1, -2)
(1-2j)
>>> complex(2, -1)
(2-1j)
>>> complex(2, 2)
(2+2j)
>>> complex(1)
(1+0j)
>>> complex(2)
(2+0j)
>>> complex('42-21j')
(42-21j)

Exemple personnalisé __complex__()

Dans l'exemple suivant, vous créez une classe personnalisée Data et écrasez le __complex__() méthode magique pour qu'elle renvoie un nombre complexe (42+21j) en essayant d'appeler le complex(x) sur un Data personnalisé objet.

class Data:
    def __complex__(self):
        return (42+21j)


x = Data()
res = complex(x) 

print(res)
# (42+21j)

TypeError :le premier argument de complex() doit être une chaîne ou un nombre, pas …

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

class Data:
    pass


x = Data()
res = complex(x)

print(res)

Sortie :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 6, in <module>
    res = complex(x)
TypeError: complex() first argument must be a string or a number, not 'Data'

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

class Data:
    def __complex__(self):
        return 1+2j


x = Data()
res = complex(x)

print(res)
# (1+2j)

TypeError :__bool__ doit renvoyer bool, renvoyé …

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

class Data:
    def __complex__(self):
        return 42


x = Data()
res = complex(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 = complex(x)
TypeError: __complex__ returned non-complex (type int)

La raison du TypeError: __complex__ returned non-complex (type ...) l'erreur est que le __complex__() La méthode doit renvoyer un nombre complexe. Ainsi, pour résoudre l'erreur, renvoyez un nombre complexe, par exemple, en utilisant la syntaxe x+yj pour deux entiers x et y dans votre définition de méthode comme indiqué précédemment :

class Data:
    def __complex__(self):
        return 1+2j # This is a complex number


x = Data()
res = complex(x)

print(res)
# (1+2j)

Références :

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