Skip to content
Extraits de code Groupes Projets
not_implemented_expl.py 2,44 ko
Newer Older
  • Learn to ignore specific revisions
  • Martin Delcourt's avatar
    Martin Delcourt a validé
    
    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