Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2031 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  problème débutant: appel méthode

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème débutant: appel méthode

n°1724239
dav74
Posté le 25-04-2008 à 11:01:47  profilanswer
 

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

mood
Publicité
Posté le 25-04-2008 à 11:01:47  profilanswer
 

n°1724273
masklinn
í dag viðrar vel til loftárása
Posté le 25-04-2008 à 11:38:56  profilanswer
 

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 :
  1. def surface(self):
  2.  self.surface = 3.14 * self.r**2


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 :
  1. def surface(self):
  2.  surface = 3.14 * self.r**2
  3.  return surface


Ou même balancer directement le résultat,  vu qu'au final la variable locale ne sert à rien?

Code :
  1. def surface(self):
  2.  return 3.14 * self.r**2


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)


Message édité par masklinn le 25-04-2008 à 11:41:35

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1724292
dav74
Posté le 25-04-2008 à 11:52:19  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  problème débutant: appel méthode

 

Sujets relatifs
probleme javaproblème avec "ALTER SESSION SET NSL_TERRITORY" [résolu]
Problème d'ajout vb6Appel dll VB depuis VC++
Probleme sur une macro excel qui ne copie pas tout[RESOLU] "applet not initiated" : quelle erreur dans le code HTML ?
[RESOLU] probleme file.exists()Petit probléme fichier
besoin d'aide pour debutant java 
Plus de sujets relatifs à : problème débutant: appel méthode


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR