Bonjour,

Je travaille en python depuis quelques mois et je suis actuellement sur un gros projet pour mon université. J'ai plutôt eu l'habitude de fortran ces dernières années donc j'ai encore beaucoup à apprendre en programmation orientée objet, et justement ma question touche à ça.

Quitte à travailler en python, je me suis dit "autant profiter au maximum de la POO, même quand c'est pas nécessaire", et j'ai commencé à jouer avec les méthodes spéciales, comme __eq__. Mon problème concerne cependant plutôt __mul__. Le projet consiste à simuler un réseau cubique, et, sans entrer dans le détail technique, j'utilise une classe "point" à laquelle j'ai ajouté une méthode __mul__ pour le produit scalaire. Mon programme nécessite à un moment donné que je multiplie un point par un nombre, j'ai donc voulu ajouter ça et j'ai eu deux surprises. La première, c'est que l'interpréteur me renvoie une erreur de type
l'opération * n'est pas implémentée pour 'float' et 'point'
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
class point :
    def __init__(self, x : int, y : int, z : int) :
        self.x = x
        self.y = y
        self.z = z
 
    def __mul__(self, other) :
        if isinstance(other, point):
            return self.x * other.x + self.y * other.y + self.z * other.z
        elif isinstance(other, float):
            return point(other * self.x, other * self.y, other * self.z)
        else :
            return NotImplemented
 
truc = point(1,1,1)
test = 5. * truc
print (test)
Ceci me renvoie donc l'erreur précédente. Ma deuxième surprise est que, sur base d'une hypothèse, j'ai commuté l'opération et ça a fonctionné :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
truc = point(1,1,1)
test = truc * 5.
print (test)
Ceci fonctionne donc. Mon hypothèse est que, puisque de ce que j'ai cru comprendre en python tout est un objet, quand je fais 5. * truc, c'est la méthode __mul__ de float qui est appelée, alors que si je fais truc * 5., c'est la méthode __mul__ de point qui est appelée. Je vois alors deux solutions, mais je n'ai aucune idée de comment les appliquer :

  1. Modifier la méthode __mul__ de float
  2. Donner la priorité à la méthode __mul__ de point


J'ai cherché un peu sur stackoverflow, mais je ne sais pas trop quels mots clefs utiliser pour trouver une réponse à ce genre de problème. Concrètement je peux contourner le problème en respectant le sens truc * 5., ou en implémentant une méthode non spéciale, mais je me dis que si c'est possible, en particulier la deuxième solution, ce serait quand même plus satisfaisant