problème débutant: appel méthode - Python - Programmation
Marsh Posté le 25-04-2008 à 11:38:56
1. Prière d'utiliser la balise CODE, parce que là c'est illisible
2. En python, les méthodes et les attributs sont dans le même namespace, donc quand tu écris
Code :
|
ben la valeur surface que tu crées écrase la méthode homonyme, d'où le message d'erreur
3. Accessoirement, j'ai du mal à voir l'intérêt de self.surface, pour ne pas dire qu'il n'en a aucun. Pourquoi ne pas créer une variable locale normale?
Code :
|
Ou même balancer directement le résultat, vu qu'au final la variable locale ne sert à rien?
Code :
|
4. Tu vas avoir exactement le même problème pour exactement les mêmes raisons dans cylindre.volume
5. Ce serait bien d'appliquer les conventions de codage de la PEP8: sauf besoin spécifique et particulier, un nom de classe commence par une majuscule
6. Enfin, il est de bon ton d'hériter d'object plutôt que de n'hériter de rien du tout, afin d'utiliser les new-style classes (sauf si besoin explicite des anciennes classes, mais ce n'est pas le cas ici)
Marsh Posté le 25-04-2008 à 11:52:19
Merci beaucoup pour tout tes conseils et désolé pour la balise code, je n'était pas au courant. Pour les new-style classes, je n'en avais pas entendu parlé (je bosse sur le livre "apprendre à programmer en python" ), il faut que je me penche sur la question
Marsh Posté le 25-04-2008 à 11:01:47
Bonjour,
Je débute sur python et voilà le script qui me pose problème :
class cercle:
def __init__(self,rayon):
self.r=rayon
def surface(self):
self.surface= 3.14*self.r**2
return self.surface
class cylindre(cercle):
def __init__(self,r,hauteur):
cercle.__init__(self,r)
self.h=hauteur
def volume(self):
self.volume=self.h*self.surface()
return self.volume
c=cylindre(3,2)
print c.surface()
print c.volume()
voilà l'erreur retournée :
david@david-eeepc:~/python$ python cercle.py
28.26
Traceback (most recent call last):
File "cercle.py", line 17, in <module>
print c.volume()
File "cercle.py", line 12, in volume
self.volume=self.h*self.surface()
TypeError: 'float' object is not callable
Après quelques recherches, j'ai remarqué que c'était le deuxième appel de la fonction self.surface() qui pose problème (pour le calcul du volume). Si à la fin de mon script je ne met que print c.volume() tout se passe bien. J'ai aussi remarqué que si j'utilise la variable self.surface pour le calcul du volume au lieu d'un deuxième appel à self.surface() cela fonctionne aussi.
Ma question n'est donc pas comment faire pour que cela fonctionne, mais plutôt pourquoi cela ne fonctionne pas comme cela ? (Pourquoi je ne peux pas appeller 2 fois la fonction self.surface() ?)
Merci d'avance pour votre aide