Bonjour à tous,

Je voulais savoir s'il était possible quand on surcharge un opérateur mathématique d'une classe (par exemple +) que le résultat se mette à jour automatiquement?

imaginons que j'ai la classe Nombre (ce n'est pas mon vrai exemple, mais je simplifie pour se concentrer sur l'essentiel)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
class Nombre():
    def __init__(self,valeur):
        self.valeur = valeur
 
    def mettre_a_jour(self, new_value):
        self.valeur = new_value
 
    def __str__(self):
        return "{}".format(self.valeur)
 
    def __add__(self, other):
        valeur = self.valeur + other.valeur
        return Nombre(valeur)
donc quand je l'utilise:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
a = Nombre(1)
b = Nombre(2)
c = a + b
print(c)   ### affiche 3 ###
a.mettre_a_jour(5)
print(a)    ###affiche 5###
print(c)    ###affiche 3###
je voudrais que c soit mis à jour automatiquement quand a est mis à jour.

actuellement j'utilise plutôt un code comme suit, mais que je voudrais simplifier si c'est possible:
la classe Observable à deux méthodes [ ajouter_observateur, notifier_observateurs]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
class Nombre(Observable):
 
    def __init__(self,valeur=0):
        self.valeur = valeur
 
    def mettre_a_jour(self, nouvelle_valeur):
       self.valeur = nouvelle_valeur
       self.notifier_observateurs()     ### je notifie les observateurs 
 
    def __str__(self):
        return "{}".format(self.valeur)
 
class ResultatAddition(Nombre):
 
    def __init__(self, nombre1, nombre2):
        self.nombre1 = nombre1
        nombre1.ajouter_observateur(self)   ### j'ajoute mon objet à la liste des observateurs du nombre 1
        self.nombre2 = nombre2
        nombre2.ajouter_observateur(self)   ### j'ajoute mon objet à la liste des observateurs du nombre 2
        super().__init__(self)
        self.ajout()
 
 
    def additionner(self):
          self.valeur = nombre1.valeur + nombre2.valeur
 
    ### méthode obligatoire de l'objet observateur qui est appelée par notifier_observateurs
    def update(self):
         self.additionner()
donc quand je l'utilise, ça donne ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
a = Nombre(1)
b = Nombre(2)
c = ResultatAddition(a, b)
 
print(c)  ### affiche 3 ###
 
a.mettre_a_jour(5)
 
print(c)  ### affiche 7 ###
Guillaume.