Problème avec l'utilisation d'une classe
Bonjour à tous,
Je croyais avoir compris ce qu'était une classe, comment ça fonctionne...
Aujourd'hui je ré-essaye et crac !
Bin, non !
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
| import random
class sommes(object):
def __init__(self,fin):
n=random.randint(3,fin)
return n
def test(self,i):
n+=i
if n%2==0:
c.pair(n)
else:
c.impair(n)
return
def pair(self,n):
print n,n*(n+1)/2
return
def impair(self,n):
print n,n**2
return
c=sommes()
for i in range(12):
c.test(i) |
D'accord, c'est un truc bidon...
Mais je voulais initialiser un nombre n, à l'intérieur de la classe, par un choix aléatoire entre 3 et 10 à la création d'une instance.
Puis je voulais en boucle ajouter la valeur de i à ce nombre n, tester si le nouveau nombre est pair ou impair et, selon, afficher la bonne valeur de la somme soit des n premiers nombres entiers soit de la somme des n premiers pairs.
Et j'ai ce message d'erreur
Citation:
Traceback (most recent call last):
File "C:\Python26\essai_classe.py", line 24, in <module>
c=sommes()
TypeError: __init__() takes exactly 2 arguments (1 given)
Et là, je suis dépassé : un truc tout bête à savoir, c'est sûr... mais que je ne sais pas !
D'autre part,
si j'appelle pair(n) et impair(n) au lieu de c.pair(n) et c.impair(n), j'ai aussi un message d'erreur :
Citation:
Traceback (most recent call last):
File "C:\Python26\essai_classe.py", line 21, in <module>
c.test(i)
File "C:\Python26\essai_classe.py", line 8, in test
impair(n)
NameError: global name 'impair' is not defined
Là encore, pourquoi ?
Je commence à douter savoir écrire un jour une classe, même simple, sans erreur...
Et tant que je ne sais pas faire ça, je ne progresserai pas en Python : j'ai uun seuil à franchir.
M'enfin, je persiste quand même.
Merci d'avance à l'âme charitable qui voudra bien prendre de son temps pour éclairer mon chemin...
@+
Rectification dans la présentation (reste a faire en français....)
Bonjour,
Citation:
Envoyé par
airod
Vous avez défini une classe avec une méthode __init__. Cette méthode est le constructeur
Petites précisions sur cette phrase qui risque d'être acquise. A corriger si besoin.
la méthode __init__() est la première appelée lors de l'instanciation d'une classe, son premier argument fait toujours référence à l'instance (celle de la méthode __init__) en cours. Par convention ce premier argument se nomme 'self'. Ce n'est donc pas un mot Python mais c'est tellement important qu'il est fortement conseillé de toujours utiliser le mots 'self'.
Du fait que l'instance ne soit visible qu'après __init__(), comme il se comporte comme un constructeur (et y ressemble) on pourrais croire que c'est Le 'constructeur' de l'instance, il n'en est rien.
L'instance existe avant puisque 'self' y fait référence.
Mais qui construit l'instance alors ? Tout simplement ().
Lorsque vous écrivez a=Foo() Python comprend qu'il doit créer une instance de Foo. Il vas ensuite lire la méthode __init__ si elle est présente, puis inscrit tout cela dans le dico (espace de nom) sous la forme 'a': <instance de Foo>.
Bon, puisque c'était juste pour cette histoire de constructeur, et que je pense que vous avez compris grâce à dividee et airod l'utilité de 'self' pour la visibilité de votre variable, je ne vais pas aller plus loin.
Trois choses à propos du code maintenant :
Vous aurez compris l'inutilité du return tout cour a la fin d'une fonction/méthode : Une fonction/méthode sans return retourne toujours None.
Je vois une différence entre votre code et celui d'airod : Vous ne créez qu'une instance alors qu'airod en crée une à chaque passage dans sa boucle for. Comme cela 'écrase' (pas très joli comme explication ça) la précédent dans l'espace de nom on ne vois rien. Dans le code présent pas de problème mais si un autre objet fait appel à une méthode de l'instance entre temps je vous laisse imaginer.
Sauf si vous n'en avait pas besoin pour autre chose je ne vois pas l'utilité des méthodes pair et impair. En effet vous pouvez écrire directement
Code:
1 2 3 4 5 6
| def test(self):
self.n += 1
if self.n%2 == 0:
return self.n, self.n*(self.n+1)/2
else:
return self.n, self.n**2 |
@+