|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour,
J'aimerais apprendre la notion de classes. Pour cela j'aimerais créer un petit fichier "py" me permettant de tirer au sort 7 numéros sur 4 grilles. Voila comment je vois les choses simples pour le moment, on affinera ensuite. J'aurais 4 classes, 1 classe pour chaque grille, que je nommerais grille1, grille2, grille3 et grille4. Pour grille1 Créer ma liste de numéros (liste1) Prendre 1 numéro au hasard entre 1 et 49 Répéter "prendre 1 numéro au hasard entre 1 et 49" 6 fois Mettre les 7 numéros dans liste1 Pour grille2 Idem grille1 Merci de m'aiguiller sans me donner la réponse, j'aimerais penser comme vous, et ne pas recopier betement sans comprendre vos codes. Question 1 : Est-ce que créer une classe grille est concevable est correct, sachant que j'imagine ma classe comme un objet? Question 2 : Dans ma façon de penser, est-ce correct ou non? Merci de m'aider à travailler sur python A bientot Je reviens demain soir, vous répondre. Bye |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
fred1599@gmail.com wrote:
> Bonjour, Bonjour, > J'aurais 4 classes, 1 classe pour chaque grille, que je nommerais > grille1, grille2, grille3 et grille4. Moi j'aurais plutot tendance à dire qu'il y a une seule classe "Grille", et 4 instances (grille_1, ..., grille_4) de cette classe. Sinon, et puisque j'y pense, au niveau de la façon d'écrire le code, je te conseille ceci: http://www.python.org/dev/peps/pep-0008/ (section "Naming Conventions") ou tu verras comment "ecrire correctement" le nom d'une classe et d'une instance. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
fred1599@gmail.com wrote:
> Bonjour, Bonjour, > J'aurais 4 classes, 1 classe pour chaque grille, que je nommerais > grille1, grille2, grille3 et grille4. Moi j'aurais plutot tendance à dire qu'il y a une seule classe "Grille", et 4 instances (grille_1, ..., grille_4) de cette classe. Sinon, et puisque j'y pense, au niveau de la façon d'écrire le code, je te conseille ceci: http://www.python.org/dev/peps/pep-0008/ (section "Naming Conventions") ou tu verras comment "ecrire correctement" le nom d'une classe et d'une instance. |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
Mihamina (R12y) Rakotomandimby wrote:
> http://www.python.org/dev/peps/pep-0008/ (section > "Naming Conventions") http://lapagearegis.free.fr/guidedestyle.html -> Conventions de Nommage |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
Mihamina (R12y) Rakotomandimby wrote:
> http://www.python.org/dev/peps/pep-0008/ (section > "Naming Conventions") http://lapagearegis.free.fr/guidedestyle.html -> Conventions de Nommage |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
On 9 sep, 21:44, "Mihamina (R12y) Rakotomandimby" <miham...@rktmb.org>
wrote: > Mihamina (R12y) Rakotomandimby wrote: > >http://www.python.org/dev/peps/pep-0008/(section > > "Naming Conventions") > > http://lapagearegis.free.fr/guidedestyle.html > -> Conventions de Nommage Ok un truc du genre class Grille : a=grille1.Grille [] #création de l'instance grille1 b=grille2.Grille [] c=grille3.Grille [] d=grille4.Grille [] Ici je n'ai pas besoin apparement d'argument pour construire ma classe il me semble? Merci pour ton aide |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
On 9 sep, 21:44, "Mihamina (R12y) Rakotomandimby" <miham...@rktmb.org>
wrote: > Mihamina (R12y) Rakotomandimby wrote: > >http://www.python.org/dev/peps/pep-0008/(section > > "Naming Conventions") > > http://lapagearegis.free.fr/guidedestyle.html > -> Conventions de Nommage Ok un truc du genre class Grille : a=grille1.Grille [] #création de l'instance grille1 b=grille2.Grille [] c=grille3.Grille [] d=grille4.Grille [] Ici je n'ai pas besoin apparement d'argument pour construire ma classe il me semble? Merci pour ton aide |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
> > Sinon, et puisque j'y pense, au niveau de la façon d'écrire le code, je > te conseille ceci: http://www.python.org/dev/peps/pep-0008/ (section > "Naming Conventions") ou tu verras comment "ecrire correctement" le nom > d'une classe et d'une instance. J'avais noté ca aussi pour les conventions http://conferences.oreillynet.com/pr...os_goodger.pdf Pour le faire du code avec une classe je ferais ca mais.... from random import randint class Grille(list): def __init__(self): i = 1 while i <=7: self.append(randint(0,49)) i += 1 g1 = Grille() g2 = Grille() g3 = Grille() g4 = Grille() print g1 print g2 print g3 print g4 ....une question idiote ca marche mais pourquoi? je suis un peu surpris de ne pas devoir appeler le contructeur de list dans le contructeur de Grille. Désolé d'embrouiller la réponse. bonne nuit |
|
|
|
#9 |
|
Messages: n/a
Hébergeur: |
> > Sinon, et puisque j'y pense, au niveau de la façon d'écrire le code, je > te conseille ceci: http://www.python.org/dev/peps/pep-0008/ (section > "Naming Conventions") ou tu verras comment "ecrire correctement" le nom > d'une classe et d'une instance. J'avais noté ca aussi pour les conventions http://conferences.oreillynet.com/pr...os_goodger.pdf Pour le faire du code avec une classe je ferais ca mais.... from random import randint class Grille(list): def __init__(self): i = 1 while i <=7: self.append(randint(0,49)) i += 1 g1 = Grille() g2 = Grille() g3 = Grille() g4 = Grille() print g1 print g2 print g3 print g4 ....une question idiote ca marche mais pourquoi? je suis un peu surpris de ne pas devoir appeler le contructeur de list dans le contructeur de Grille. Désolé d'embrouiller la réponse. bonne nuit |
|
|
|
#10 |
|
Messages: n/a
Hébergeur: |
fred1599@gmail.com a écrit :
> Bonjour, > > J'aimerais apprendre la notion de classes. > > Pour cela j'aimerais créer un petit fichier "py" me permettant de > tirer au sort 7 numéros sur 4 grilles. > > Voila comment je vois les choses simples pour le moment, on affinera > ensuite. > > J'aurais 4 classes, 1 classe pour chaque grille, que je nommerais > grille1, grille2, grille3 et grille4. AMHA, tu n'a pas compris le principe de base d'une classe. Tu n'a pas besoin de 4 classes différentes, une seule suffit. Regarde la class int (les nombres entiers) : c'est la même classes pour tous les entiers, pas une classe par nombre !-) > Pour grille1 > Créer ma liste de numéros (liste1) > Prendre 1 numéro au hasard entre 1 et 49 > Répéter "prendre 1 numéro au hasard entre 1 et 49" 6 fois > Mettre les 7 numéros dans liste1 Ce que tu décris là est un algorithme, pas un type. Avant toute autre chose, une classe décrit un type de données, c'est à dire la structure de données, la plage de valeurs, et les opérations possibles. Dans ton cas, ta classe Grille serait un ensemble de 7 nombres entier compris entre 1 et 49. Je te laisse définir les opérations qui te semblent appropriées, mais tu peux déjà songer à l'égalité (deux grilles sont elles identiques ?). mes deux centimes... |
|
|
|
#11 |
|
Messages: n/a
Hébergeur: |
fred1599@gmail.com a écrit :
> Bonjour, > > J'aimerais apprendre la notion de classes. > > Pour cela j'aimerais créer un petit fichier "py" me permettant de > tirer au sort 7 numéros sur 4 grilles. > > Voila comment je vois les choses simples pour le moment, on affinera > ensuite. > > J'aurais 4 classes, 1 classe pour chaque grille, que je nommerais > grille1, grille2, grille3 et grille4. AMHA, tu n'a pas compris le principe de base d'une classe. Tu n'a pas besoin de 4 classes différentes, une seule suffit. Regarde la class int (les nombres entiers) : c'est la même classes pour tous les entiers, pas une classe par nombre !-) > Pour grille1 > Créer ma liste de numéros (liste1) > Prendre 1 numéro au hasard entre 1 et 49 > Répéter "prendre 1 numéro au hasard entre 1 et 49" 6 fois > Mettre les 7 numéros dans liste1 Ce que tu décris là est un algorithme, pas un type. Avant toute autre chose, une classe décrit un type de données, c'est à dire la structure de données, la plage de valeurs, et les opérations possibles. Dans ton cas, ta classe Grille serait un ensemble de 7 nombres entier compris entre 1 et 49. Je te laisse définir les opérations qui te semblent appropriées, mais tu peux déjà songer à l'égalité (deux grilles sont elles identiques ?). mes deux centimes... |
|
|
|
#12 |
|
Messages: n/a
Hébergeur: |
fred1599@gmail.com a écrit :
> On 9 sep, 21:44, "Mihamina (R12y) Rakotomandimby" <miham...@rktmb.org> > wrote: >> Mihamina (R12y) Rakotomandimby wrote: >>> http://www.python.org/dev/peps/pep-0008/(section >>> "Naming Conventions") >> http://lapagearegis.free.fr/guidedestyle.html >> -> Conventions de Nommage > > Ok un truc du genre > > class Grille : > a=grille1.Grille [] #création de l'instance grille1 Dis voir... Qu'est-ce que tu dirais de lire un tutoriel Python avant d'aller plus loin ? |
|
|
|
#13 |
|
Messages: n/a
Hébergeur: |
fred1599@gmail.com a écrit :
> On 9 sep, 21:44, "Mihamina (R12y) Rakotomandimby" <miham...@rktmb.org> > wrote: >> Mihamina (R12y) Rakotomandimby wrote: >>> http://www.python.org/dev/peps/pep-0008/(section >>> "Naming Conventions") >> http://lapagearegis.free.fr/guidedestyle.html >> -> Conventions de Nommage > > Ok un truc du genre > > class Grille : > a=grille1.Grille [] #création de l'instance grille1 Dis voir... Qu'est-ce que tu dirais de lire un tutoriel Python avant d'aller plus loin ? |
|
|
|
#14 |
|
Messages: n/a
Hébergeur: |
jean-marc pouchoulon a écrit :
> >> >> Sinon, et puisque j'y pense, au niveau de la façon d'écrire le code, >> je te conseille ceci: http://www.python.org/dev/peps/pep-0008/ >> (section "Naming Conventions") ou tu verras comment "ecrire >> correctement" le nom d'une classe et d'une instance. > > J'avais noté ca aussi pour les conventions > http://conferences.oreillynet.com/pr...os_goodger.pdf > > Pour le faire du code avec une classe je ferais ca mais.... > > from random import randint > > class Grille(list): > def __init__(self): > i = 1 > while i <=7: > self.append(randint(0,49)) > i += 1 > for i in xrange(1,8): self.append(randint(1,49)) > g1 = Grille() > g2 = Grille() > g3 = Grille() > g4 = Grille() > > print g1 > print g2 > print g3 > print g4 > > > ...une question idiote ca marche mais pourquoi? Pourquoi est-ce qye ça ne marcherais pas ? > je suis un peu surpris de ne pas devoir appeler le contructeur de list > dans le contructeur de Grille. Tu n'a pas surchargé le constructeur de list, tu n'a donc pas à l'appeler. Note bien que __init__() n'est *pas* le constructeur, mais l'initialiseur. Le constructeur, c'est __new__(). Accessoirement, sous-classer liste n'est probablement pas la meilleur chose à faire ici. Une grille de loto n'est définitivement pas une liste (sémantique et invariants différents). Que tu utilise une liste pour implémenter ta grille, c'est ton choix (et une solution possible), mais ça ne devrait pas être visible. |
|
|
|
#15 |
|
Messages: n/a
Hébergeur: |
jean-marc pouchoulon a écrit :
> >> >> Sinon, et puisque j'y pense, au niveau de la façon d'écrire le code, >> je te conseille ceci: http://www.python.org/dev/peps/pep-0008/ >> (section "Naming Conventions") ou tu verras comment "ecrire >> correctement" le nom d'une classe et d'une instance. > > J'avais noté ca aussi pour les conventions > http://conferences.oreillynet.com/pr...os_goodger.pdf > > Pour le faire du code avec une classe je ferais ca mais.... > > from random import randint > > class Grille(list): > def __init__(self): > i = 1 > while i <=7: > self.append(randint(0,49)) > i += 1 > for i in xrange(1,8): self.append(randint(1,49)) > g1 = Grille() > g2 = Grille() > g3 = Grille() > g4 = Grille() > > print g1 > print g2 > print g3 > print g4 > > > ...une question idiote ca marche mais pourquoi? Pourquoi est-ce qye ça ne marcherais pas ? > je suis un peu surpris de ne pas devoir appeler le contructeur de list > dans le contructeur de Grille. Tu n'a pas surchargé le constructeur de list, tu n'a donc pas à l'appeler. Note bien que __init__() n'est *pas* le constructeur, mais l'initialiseur. Le constructeur, c'est __new__(). Accessoirement, sous-classer liste n'est probablement pas la meilleur chose à faire ici. Une grille de loto n'est définitivement pas une liste (sémantique et invariants différents). Que tu utilise une liste pour implémenter ta grille, c'est ton choix (et une solution possible), mais ça ne devrait pas être visible. |
|
|
|
#16 |
|
Messages: n/a
Hébergeur: |
> > Tu n'a pas surchargé le constructeur de list, tu n'a donc pas à > l'appeler. Note bien que __init__() n'est *pas* le constructeur, mais > l'initialiseur. Le constructeur, c'est __new__(). > Ok c'est un abus de langage que tu as raison de souligner. Quand je regarde "Unifying types and classes in Python 2.2" l'initialisateur de dict est bien appelé: Here's an example of a simple dict subclass, which provides a "default value" that is returned when a missing key is requested: class defaultdict(dict): def __init__(self, default=None): dict.__init__(self) self.default = default def __getitem__(self, key): try: return dict.__getitem__(self, key) except KeyError: return self.default http://www.python.org/download/releases/2.2/descrintro/ Je pensais que le fait de déclarer une méthode suffisait à surcharger le constructeur de la classe parent. >>> class parent(object): .... def __init__(self): .... self.valeur = 1 .... >>> class enfant(parent): .... pass .... >>> e=enfant() >>> e.valeur 1 >>> class enfant(parent): .... def __init__(self): .... self.valeur=2 .... >>> e=enfant() >>> e.valeur 2 >>> je loupe quelque chose jean-marc |
|
|
|
#17 |
|
Messages: n/a
Hébergeur: |
> > Tu n'a pas surchargé le constructeur de list, tu n'a donc pas à > l'appeler. Note bien que __init__() n'est *pas* le constructeur, mais > l'initialiseur. Le constructeur, c'est __new__(). > Ok c'est un abus de langage que tu as raison de souligner. Quand je regarde "Unifying types and classes in Python 2.2" l'initialisateur de dict est bien appelé: Here's an example of a simple dict subclass, which provides a "default value" that is returned when a missing key is requested: class defaultdict(dict): def __init__(self, default=None): dict.__init__(self) self.default = default def __getitem__(self, key): try: return dict.__getitem__(self, key) except KeyError: return self.default http://www.python.org/download/releases/2.2/descrintro/ Je pensais que le fait de déclarer une méthode suffisait à surcharger le constructeur de la classe parent. >>> class parent(object): .... def __init__(self): .... self.valeur = 1 .... >>> class enfant(parent): .... pass .... >>> e=enfant() >>> e.valeur 1 >>> class enfant(parent): .... def __init__(self): .... self.valeur=2 .... >>> e=enfant() >>> e.valeur 2 >>> je loupe quelque chose jean-marc |
|
|
|
#18 |
|
Messages: n/a
Hébergeur: |
jean-marc pouchoulon a écrit :
> >> >> Tu n'a pas surchargé le constructeur de list, tu n'a donc pas à >> l'appeler. Note bien que __init__() n'est *pas* le constructeur, mais >> l'initialiseur. Le constructeur, c'est __new__(). >> > Ok c'est un abus de langage que tu as raison de souligner. > Quand je regarde "Unifying types and classes in Python 2.2" > l'initialisateur de dict est bien appelé: > > Here's an example of a simple dict subclass, which provides a "default > value" that is returned when a missing key is requested: > > class defaultdict(dict): > > def __init__(self, default=None): > dict.__init__(self) > self.default = default > > def __getitem__(self, key): > try: > return dict.__getitem__(self, key) > except KeyError: > return self.default > > http://www.python.org/download/releases/2.2/descrintro/ > > Je pensais que le fait de déclarer une méthode suffisait à surcharger le > constructeur de la classe parent. <hs mode="plus ou moins"> Je sais que je suis un peu pénible avec ça, mais bien que je comprennes ce que tu veux dire, ta formulation est erronée, et AMHA, quand on ne pense pas avec les bons termes, on ne peut pas comprendre clairement le concept !-) Donc, le fait de définir une fonction dans une classe[1] ne surcharge ni l'initialiseur, ni le constructeur de la classe parent *sauf* bien sûr si la fonction s'appelle __new__ ou __init__ !-) [1] ou d'associer un nom à une fonction dans l'espace de nommage de la classe, ce qui revient au même... </hs> En tout état de cause, en ce qui concerne les types 'conteneurs' builtins (classes codée en C...), le stockage du 'contenu' n'est pas fait dans un attribut défini dans l'initialiseur et accessible depuis Python. Dans l'exemple ci-dessus, l'appel à dict.__init__ est totalement inutile - essaie par toi-même... Pour que cet appel serve à quelque chose, il aurait fallu gérer les différentes façons possibles d'initialiser un dict (séquence de paire clé/valeur, arguments nommés etc). |
|
|
|
#19 |
|
Messages: n/a
Hébergeur: |
jean-marc pouchoulon a écrit :
> >> >> Tu n'a pas surchargé le constructeur de list, tu n'a donc pas à >> l'appeler. Note bien que __init__() n'est *pas* le constructeur, mais >> l'initialiseur. Le constructeur, c'est __new__(). >> > Ok c'est un abus de langage que tu as raison de souligner. > Quand je regarde "Unifying types and classes in Python 2.2" > l'initialisateur de dict est bien appelé: > > Here's an example of a simple dict subclass, which provides a "default > value" that is returned when a missing key is requested: > > class defaultdict(dict): > > def __init__(self, default=None): > dict.__init__(self) > self.default = default > > def __getitem__(self, key): > try: > return dict.__getitem__(self, key) > except KeyError: > return self.default > > http://www.python.org/download/releases/2.2/descrintro/ > > Je pensais que le fait de déclarer une méthode suffisait à surcharger le > constructeur de la classe parent. <hs mode="plus ou moins"> Je sais que je suis un peu pénible avec ça, mais bien que je comprennes ce que tu veux dire, ta formulation est erronée, et AMHA, quand on ne pense pas avec les bons termes, on ne peut pas comprendre clairement le concept !-) Donc, le fait de définir une fonction dans une classe[1] ne surcharge ni l'initialiseur, ni le constructeur de la classe parent *sauf* bien sûr si la fonction s'appelle __new__ ou __init__ !-) [1] ou d'associer un nom à une fonction dans l'espace de nommage de la classe, ce qui revient au même... </hs> En tout état de cause, en ce qui concerne les types 'conteneurs' builtins (classes codée en C...), le stockage du 'contenu' n'est pas fait dans un attribut défini dans l'initialiseur et accessible depuis Python. Dans l'exemple ci-dessus, l'appel à dict.__init__ est totalement inutile - essaie par toi-même... Pour que cet appel serve à quelque chose, il aurait fallu gérer les différentes façons possibles d'initialiser un dict (séquence de paire clé/valeur, arguments nommés etc). |
|
|
|
#20 |
|
Messages: n/a
Hébergeur: |
jean-marc pouchoulon wrote:
> class Grille(list): > def __init__(self): > i = 1 > while i <=7: > self.append(randint(0,49)) "self.append"... "self" serait une liste? j'avoue que je ne m'explique pas le truc là. |
|
|
|
#21 |
|
Messages: n/a
Hébergeur: |
jean-marc pouchoulon wrote:
> class Grille(list): > def __init__(self): > i = 1 > while i <=7: > self.append(randint(0,49)) "self.append"... "self" serait une liste? j'avoue que je ne m'explique pas le truc là. |
|
|
|
#22 |
|
Messages: n/a
Hébergeur: |
fred1599@gmail.com wrote:
> Ok un truc du genre > class Grille : > a=grille1.Grille [] #création de l'instance grille1 Ouh là là... tu ne découvre pas que "les classes". Mais ne t'inquiete pas, la syntaxe Python est facile. |
|
|
|
#23 |
|
Messages: n/a
Hébergeur: |
fred1599@gmail.com wrote:
> Ok un truc du genre > class Grille : > a=grille1.Grille [] #création de l'instance grille1 Ouh là là... tu ne découvre pas que "les classes". Mais ne t'inquiete pas, la syntaxe Python est facile. |
|
|
|
#24 |
|
Messages: n/a
Hébergeur: |
Mihamina (R12y) Rakotomandimby wrote:
> jean-marc pouchoulon wrote: > >> class Grille(list): >> def __init__(self): >> i = 1 >> while i <=7: >> self.append(randint(0,49)) > > "self.append"... "self" serait une liste? > j'avoue que je ne m'explique pas le truc là. class Grille(list): la classe Grille dérive de list |
|
|
|
#25 |
|
Messages: n/a
Hébergeur: |
Mihamina (R12y) Rakotomandimby wrote:
> jean-marc pouchoulon wrote: > >> class Grille(list): >> def __init__(self): >> i = 1 >> while i <=7: >> self.append(randint(0,49)) > > "self.append"... "self" serait une liste? > j'avoue que je ne m'explique pas le truc là. class Grille(list): la classe Grille dérive de list |
|
![]() |
| Outils de la discussion | |
|
|