Excellent. Attention toutefois que ta méthode __mul__ gère les float mais pas les int (ne peut-on pas multiplier un point par un entier?) et que multiplier deux points devrait (à mon avis) donner un 3° point (et non la somme des valeurs multipliées).
Il faut aussi penser à l'héritage. Si un utilisateur sous-classe ton point dans un objet à lui qu'il nommera "monPointMeilleur" et qu'il multiplie un objet à lui par un float, il aimerait peut-être recevoir en retour un "monPointMeilleur" et pas un simple point...
Et il faut penser à celui qui voudra écrire
point * (-point). Et au teubé qui lui tentera
point * (+point) juste pour te faire ch...
Hé oui, pas évident de faire de l'objet...
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
| class point :
def __init__(self, x : int, y : int, z : int) -> object:
self.x = x
self.y = y
self.z = z
# __init__()
def __str__(self): return "x={}, y={}, z={}".format(self.x, self.y, self.z)
def __neg__(self): return self.__class__(-self.x, -self.y, -self.z)
def __pos__(self): return self.__class__(self.x, self.y, self.z)
def __mul__(self, other) :
if isinstance(other, point): pass
elif isinstance(other, (int, float)):
other=self.__class__(other, other, other)
else: raise TypeError(
"on ne peut pas multiplier un point avec un {}".format(type(other).__name__)
)
return self.__class__(other.x * self.x, other.y * self.y, other.z * self.z)
# __mul__()
def __rmul__(self, other): return self*other
# point
class superPoint(point): pass
truc = superPoint(1,2,3)
x=truc*5
print(x, type(x))
print(7.0*truc)
print(truc*(+truc))
print(-truc)
print(truc*"hello") |
Ne te reste qu'à implémenter __add__, __radd__, __sub__, __rsub__, __truediv__, __rtruediv__, __floordiv__, __rfloordiv__, __pow__, __rpow__, __eq__, __ne__, __lt__, __le__, __gt__ et __ge__
Et tu peux même rajouter éventuellement __imul__ (i=inplace) si tu veux que
point*=n se comporte différemment de
point=point*n (et leurs équivalents __iadd__, __isub__, __itruediv__, __ifloordiv__ et __ipow__ pour les opérations équivalentes)
Et n'oublions pas __abs__, __bool__, __int__ et __float__ au cas où tu voudrais que
abs(truc),
bool(truc),
int(truc) et
float(truc) soient aussi possibles (comme __str__ permet de faire
str(truc)).
Bienvenue dans le monde merveilleux de la POO. Tu vas t'éclater
Toutefois je te le redis, tu as tout à fait raison de penser objet. Parce que quand tu auras construit les bases, le reste ira super vite.
Partager