Pour personnaliser le comportement de l'opérateur de négation -x
, remplacez le __neg__(self)
méthode dunder dans votre définition de classe. Python appelle en interne x.__neg__()
pour calculer l'inverse (négation) d'un objet, c'est-à-dire -x
. Si le __neg__()
méthode n'est pas définie, Python lèvera un TypeError
.
Syntaxe
__neg__(self)
Pour utiliser la négation opérateur -x
sur un objet personnalisé x
, définissez le __neg__()
"dunder" méthode magique qui prend un argument :une référence à elle-même, appelée self
. Vous pouvez ensuite utiliser les attributs des objets personnalisés pour déterminer la négation de l'objet. Il peut renvoyer n'importe quel objet mais la convention est de renvoyer un objet du même type afin que -(-x) == x
.
Regardons un exemple ensuite.
Exemple
Dans le code suivant, vous créez un objet Personne alice
avec une chaîne name
attribut défini sur 'alice'
. La négation est simplement le name
chaîne dans l'ordre inverse en utilisant le découpage avec une taille de pas négative self.name[::-1]
.
class Person: def __init__(self, name): self.name = name def __neg__(self): return self.name[::-1] alice = Person('alice') print(-alice) # ecila
L'objet inversé -alice
renvoie l'attribut 'alice'
dans l'ordre inverse tel que défini dans le __neg__()
méthode. Cependant, ce n'est pas une manière propre d'utiliser le __neg__
méthode dunder. Au lieu de cela, vous devez toujours renvoyer le même objet (par convention) afin que le critère d'inversion soit rempli, c'est-à-dire -(-x) == x
en supposant que la méthode dunder d'égalité est correctement définie.
Vous pouvez voir une utilisation appropriée dans l'exemple suivant :
class Person: def __init__(self, name): self.name = name def __neg__(self): return Person(self.name[::-1]) def __eq__(self, other): return self.name == other.name alice = Person('alice') print(-(-alice) == alice) # True
[Corrigé] TypeError :mauvais type d'opérande pour unaire –
Si vous essayez d'utiliser l'opérateur unaire -x
sur un objet x
qui ne définit pas le __neg__
méthode dunder, Python lève un TypeError: bad operand type for unary
.
class Person: def __init__(self, name): self.name = name alice = Person('alice') print(-alice)
Voici le message d'erreur de cet extrait de code :
Traceback (most recent call last): File "C:\Users\...\code.py", line 8, in <module> print(-alice) TypeError: bad operand type for unary -: 'Person'
Pour corriger cette erreur, définissez simplement le __neg__()
unaire méthode dunder dans la définition de classe de l'objet sur lequel vous essayez d'appeler l'opérateur de négation -
.
Ceci est illustré ici :
class Person: def __init__(self, name): self.name = name def __neg__(self): return Person(self.name[::-1]) alice = Person('alice') neg_alice = -alice print(neg_alice.name) # ecila