si j ecris
def somme (…………………………...je souhaite passer deux points en argument comment faireCode:
1
2
3
4 class point: __init___(self,x,y) self.x=x self.y=y
merci beaucoup
Version imprimable
si j ecris
def somme (…………………………...je souhaite passer deux points en argument comment faireCode:
1
2
3
4 class point: __init___(self,x,y) self.x=x self.y=y
merci beaucoup
Salut,
S'il s'agissait de nombres, vous écririez:
Dans ce cas a et b ne sont rien d'autre que des instances de nombres.Code:
1
2
3 a = 1 b = 2 somme(a, b)
Si vous voulez appeler somme avec des instances de points, il suffit d'écrire:
C'est pas compliqué, il faut juste savoir qu'en Python tout est objet et qu'on peut utiliser ses propres classes comme on a appris à utiliser des instances de classes prédéfinies pour les opérations de base.Code:
1
2
3 a = Point(...) b = Point(...) somme(a, b)
- W
j'ai ecris
erreurCode:
1
2
3
4
5
6
7
8
9
10
11
12 class Point: def __init__(self,x,y): self.x=x self.y=y def somme(self,p1,p2): self.p1.x=p1.x+p2.x self.p1.y=p1.y+p2.y return Point p3=Point (3,2) Point p4=Point(2,1) somme(p3,p4) print(f"abscisse{p3.x} ordonnee{p4.y}")
merciCode:
1
2
3
4
5
6
7 C:\Users\Administrateur\PycharmProjects\test\venv\Scripts\python.exe C:/Users/Administrateur/PycharmProjects/test/maclasse.py File "C:/Users/Administrateur/PycharmProjects/test/maclasse.py", line 9 Point p3=Point (3,2) ^ SyntaxError: invalid syntax Process finished with exit code 1
Normal.
Déjà tu as un principal souci de conception. En effet, si tu écris a=2; b=3; somme(a, b) tu t'attends à avoir 5 sans que "a" et "b" soient modifiés non ?
Donc là c'est pareil, la méthode "somme()" doit renvoyer un nouveau point sans modifier p1 ou p2.
Ensuite autre souci de conception: la classe "Point" n'a pas d'attribut "p1". Tu ne peux donc pas demander self.p1 puisque "p1" n'existe pas. A la limite tu peux le créer mais il faudrait alors le définir au préalable pour que "p1" soit lui-même un objet contenant deux attributs "x" et "y" pour que tu puisses alors créer self.p1=cet_objet() puis écrire enfin self.p1.x=qqchose. Mais il n'y a plus aucun rapport entre le "p1" de "self" et le p1 d'origine. Sinon ce return final tu l'as mis pour quoi ???
Et enfin la méthode "somme()" est une méthode d'instance. C'est à dire que tu ne peux l'invoquer que depuis une instance de Point (ex toto=Point(...); toto.somme(..., ...)).
Et enfin si tu n'es même pas capable de copier/coller l'exemple de wiztricks en écrivant Point p1=Point(...) alors que lui a écrit p1=Point(...)...:roll: T'es vraiment formateur en informatique ??? :weird:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class Point: def __init__(self,x,y): self.x=x self.y=y __str__=lambda self: "x=%s, y=%s" % (self.x, self.y) @classmethod def somme(cls, p1, p2): return cls(p1.x + p2.x, p1.y + p2.y) a=Point(2, 3.5) b=Point(4, 5) c=Point.somme(a, b) print(c)
Bon, l'inconvénient de cette façon de faire, c'est que somme() s'attend à recevoir deux points (interdit d'écrire par exemple Point.somme(a, 5) car elle ne sait pas additionner un point et un int.
Autre façon de faire: le polymorphisme. Apprendre à l'objet "Point" à additionner des trucs (int, float, point) à un point et définir une fonction "somme()" de façon générale, qui additionne bêtement les trucs qu'elle reçoit (y compris des points)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 class Point: def __init__(self,x,y): self.x=x self.y=y __str__=lambda self: "x=%s, y=%s" % (self.x, self.y) def __add__(self, n): # Permet d'additionner un point et autre chose (ex Point + 5) return Point(self.x + n.x, self.y + n.y)\ if isinstance(n, Point)\ else Point(self.x + n, self.y + n) def __radd__(self, n): return self.__add__(n) # Permet la commutativité de l'addition (ex 5 + Point) somme=lambda *args: sum(args) a=Point(2, 3.5) b=Point(4, 5) c=somme(a, b, 5, b, a) print(c)
Et on peut même additionner directement => print(a+b+5+b+a)
bonjour
que faire de ce retour
NameError: name 'Vecteur' is not definedCode:
1
2
3
4 C:\Users\Administrateur\PycharmProjects\vecteur\venv\Scripts\python.exe C:/Users/Administrateur/PycharmProjects/vecteur/repere Traceback (most recent call last): File "C:/Users/Administrateur/PycharmProjects/vecteur/repere", line 15, in <module> v1 = Vecteur(1, 2)[
Process finished with exit[Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 class Repere: def __init__(self, abscisse, ordonnée): self.abscisse = abscisse self.ordonnée = ordonnée class Somme(Repere): def __init__(self, vecteur): super().__init__(abscisse=10, ordonnée=10, somme=10) def __add__(self, v): return Vecteur(self.x + v.x, self.y + v.y) v1 = Vecteur(1, 2) v2 = Vecteur(3, 4) print(v1 + v2)
mon code
merci
comment faire pour le declarer…………………………………..
Par exemple avec:
ou bien:Code:
1
2 class Vecteur: # à compléter selon vos souhaits.
Il faudrait que vous compreniez que programmer, c'est juste composer et décomposer des choses simples qu'à la fin elle deviennent compliquées.Code:
1
2 def Vecteur(a, b): ...
Et si pour comprendre une erreur, il suffit de décomposer ce qu'il se passe en choses simples, sans les maîtriser, vous êtes juste perdu.
- W
bonjour
Code:
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 from math import * class Vecteur: def __init__(self,x=5,y=6): self.x=x self.y=y def point(self,u): u.x=10 u.y=20 def affichage(self): return ('+str(self.x)'+'+str(self.y)+') def norme(self): return hypot(self.x,self.y) def __add__(self,v): return Vecteur(self.x+v.x,self.y+v.y) def __rmul__(self,r): return Vecteur(self.x*r,self.y*r) def __mul__(self,v): return self.x*v.x+self.y*v.y def colin(self,v): return self.x*v.y==self.y*v.x Vecteur.point(10, 20)
commment faire , merciCode:
1
2
3
4
5
6
7 C:\Users\Administrateur\PycharmProjects\vecteur\venv\Scripts\python.exe C:/Users/Administrateur/PycharmProjects/vecteur/repere Traceback (most recent call last): File "C:/Users/Administrateur/PycharmProjects/vecteur/repere", line 31, in <module> Vecteur.point(10, 20) File "C:/Users/Administrateur/PycharmProjects/vecteur/repere", line 10, in point u.x=10 AttributeError: 'int' object has no attribute 'x'
Salut,
Comment faire quoi?
Normalement quand on arrive aux classes, on devrait déjà savoir qu'écrire Vecteur.point(10, 20) est une ânerie.
Si vous avez un peu potasser le chapitre de votre tuto préféré qui aborde les "class", vous savez faire la différence entre "class", "instance" et "attribut" ainsi qu'avant d'appliquer une méthode à un objet, il faut l'avoir créé.
D'autant que différents intervenants vous ont déjà expliqué cela (relisez les premières réponses de cette discussion).
Que vous l'ayez oublié, que vous soyez incapable de faire le lien, ou que vous n'arrivez pas à assimiler ces concepts parce que trop abstraits, c'est pas grave.
Juste qu'il va falloir accepter que "programmer", c'est pas votre truc et peut être apprendre un métier moins abstrait: électricien, plombier, mécanicien, menuisier, tailleur de pierre,... Un boulot où on voit ce qui se passe et où on touche la matière avec ses mains.
- W