Python >> Tutoriel Python >  >> Python

Méthode magique Python __neg__

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