Newer
Older
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
print("Imaginons deux programmeurs python différents.")
print("Le premier tente de construire une classe 'vecteur à deux dimension' rudimentaire")
print("Il crée la classe 'first_class' et définit l'addition entre deux vecteurs")
print("Et il a pensé à rajouter le 'NotImplemented' dans ses opérations.")
class first_class:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self,other):
try:
return(first_class(self.x+other.x,self.y+other.y))
except:
print("Cannot use first_class.__add__ ---> returning NotImplemented")
return NotImplemented
def __radd__(self,other):
return self+other
print("Un second programmeur crée une autre classe, 'second_class' qui a pour seul but de compter le nombre de fois qu'un tel objet aura été dans une addition")
print("On voudrait que cet objet puisse être additionné avec n'importe quel autre objet.")
class second_class:
def __init__(self):
self.addition_counter = 0
def __repr__(self):
return "Was added {} time(s)".format(self.addition_counter)
def __add__(self,other):
new_addition = second_class()
new_addition.addition_counter = self.addition_counter + 1
return new_addition
def __radd__(self,other):
print("second_class.__radd__ called")
return self + other
print("En particulier, on voit que ça devrait marcher avec la classe de l'autre programmeur\n\n")
v1 = first_class(0,0)
counter = second_class()
print("v1 + counter va appeler v1.__add__, mais v1 ne sait pas que counter existe !")
print("Il renvoie donc 'NotImplemented' et on appelle counter.__radd__, qui lui fonctionne bien.")
counter = v1 + counter
print(counter)
print("\n\n\n")
print("Maintenant, regardons ce même exemple si le premier programmeur n'avait pas renvoyé 'NotImplemented'")
class first_class_without_protection:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self,other):
print("Calling first_class_without_protection.__add__")
return(first_class_without_protection(self.x+other.x,self.y+other.y))
def __radd__(self,other):
return self+other
v2 = first_class_without_protection(0,0)
counter2 = second_class()
print("Dans ce cas-ci, la méthode __add__ de la première classe va planter lors de l'addition, sans laisser la possibilité à second_class d'effectuer __radd__")
counter = v2 + counter