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

  FORUM HardWare.fr
  Programmation
  Python

  TypeError: 'module' object is not callable

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

TypeError: 'module' object is not callable

n°805215
yo c spi
Yo !
Posté le 24-07-2004 à 11:34:02  profilanswer
 

Salut,  
je viens juste de débuter en python (hier soir exactement), et j'e voualis essayer d'utiliser un objer mais j'ai cette erreur : TypeError: 'module' object is not callable
 
voila le code :
la classe principale : main.py

Code :
  1. import Voiture
  2. print "debut du programme"
  3. voit = Voiture()
  4. print "Description :\nMarque : "+voit.marque()+"\nNb roues : "+str(voit.nbRoues())


Voiture.py :

Code :
  1. class Voiture :
  2.         marque = "Renault"
  3.         roues = 4
  4.         demarree = 0
  5.        
  6.         def __init__() :
  7.                 print "On monte dans la voiture"
  8.        
  9.         def marque() :
  10.                 return marque
  11.        
  12.         def nbRoues() :
  13.                 return roues
  14.        
  15.         def statut() :
  16.                 return demarree
  17.        
  18.         def demarre() :
  19.                 demarrree = 1
  20.        
  21.         def arreter() :
  22.                 demarrer = 0


Comme vous pouvez le voir c'est tout simple, mais ca bloque.
 
merci


---------------
J.C. Farinet
mood
Publicité
Posté le 24-07-2004 à 11:34:02  profilanswer
 

n°805220
Taz
bisounours-codeur
Posté le 24-07-2004 à 11:37:56  profilanswer
 

Voiture c'est le module
 
Voiture.Voiture c'est la classe :o
 
dis-donc, tu ferais bien de réviser et de jouer un peu avec dir()

n°805224
yo c spi
Yo !
Posté le 24-07-2004 à 11:41:12  profilanswer
 

Ok je viens de comprendre un paquet de trucs d'un coup
Je suis habitué à java (une classe -> un fichier)


---------------
J.C. Farinet
n°805225
Taz
bisounours-codeur
Posté le 24-07-2004 à 11:43:14  profilanswer
 

ben en java tu as le même type de problème ... alors ton excuse elle est bidon.
 
java.lang() ça ne donnera jamais rien

n°805231
yo c spi
Yo !
Posté le 24-07-2004 à 11:56:00  profilanswer
 

En java, les fichiers dans le meme répertoires sont automatqiement importés, alors que ici en import c'est considéré comme une package (dis moi si je me trompe, mais gentiement stp)


---------------
J.C. Farinet
n°805237
Taz
bisounours-codeur
Posté le 24-07-2004 à 12:03:16  profilanswer
 

tu confonds module et package

n°805251
yo c spi
Yo !
Posté le 24-07-2004 à 12:12:44  profilanswer
 

si j'ai bein compris, toutes les classes python dans un fichier sont des "inner class" et le fichier est un module
 
Je vais tester ca avec un fichier Garage contenant la classe Voiture et ListeVoitures


---------------
J.C. Farinet
n°806196
Valeriand
Posté le 26-07-2004 à 11:52:39  profilanswer
 

Corrections dans le texte:

Code :
  1. from Voiture import Voiture
  2. print "debut du programme"
  3. voit = Voiture()
  4. print "Description :\nMarque : "+voit.marque()+"\nNb roues : "+str(voit.nbRoues())


Voiture.py :

Code :
  1. class Voiture :
  2.         self.marque = "Renault"
  3.         self.roues = 4
  4.         self.demarree = 0
  5.        
  6.         def __init__(self) :
  7.                 print "On monte dans la voiture"
  8.        
  9.         def marque(self) :
  10.                 return self.marque
  11.        
  12.         def nbRoues(self) :
  13.                 return self.roues
  14.        
  15.         def statut(self) :
  16.                 return self.demarree
  17.        
  18.         def demarre(self) :
  19.                 self.demarree = 1
  20.        
  21.         def arreter() :
  22.                 self.demarrer = 0


Comme vous pouvez le voir c'est tout simple, mais ca bloque.
merci[/citation]
 
Observations diverses:
regarde bien la syntaxe de la commande import, ça t'évitera l'erreur que tu as fait.
Ensuite quand tu utilises des classes en Python n'oublie pas que les fonctions ont toutes au moins un paramètres: self (equivalent du this en C++). De même pour indiquer qu'une variable est membre d'une classe il faut la nommer self.variable.
Fais attention à ce genre de petites subtilités, Python est très facile à utiliser mais il faut acquérir quelques petites habitudes.


Message édité par Valeriand le 26-07-2004 à 11:53:13
n°806222
masklinn
í dag viðrar vel til loftárása
Posté le 26-07-2004 à 12:14:03  profilanswer
 

j'aurais même mis:

Code :
  1. class Voiture :         
  2.           def __init__(self) :
  3.                   self.marque = "Renault"
  4.                   self.roues = 4
  5.                   self.demarree = False
  6.                   print "On monte dans la voiture"
  7.          
  8.           def getmarque(self) :
  9.                   return self.marque
  10.          
  11.           def getnbRoues(self) :
  12.                   return self.roues
  13.          
  14.           def getstatut(self) :
  15.                   return self.demarree
  16.          
  17.           def demarre(self) :
  18.                   self.demarree = True
  19.          
  20.           def arreter(self) :
  21.                   self.demarree = False


question: pourquoi 8 espaces par tab? (habituellement c'est 4)

yo c spi a écrit :

si j'ai bein compris, toutes les classes python dans un fichier sont des "inner class" et le fichier est un module


Principe de base de python:
une variable est un objet, une fonction est un objet, une instance de classe est un objet, un module est un objet, tout est objet en python
 
Donc ta classe "Voiture" est un membre de l'objet-module "Voiture"
 
Ce qui fait que dans ton fichier Voiture.py tu pourrais aussi avoir une classe "Vehicule" parent de Voiture et une classe "Camion" descendant de Vehicule au même titre que voiture, et ils seraient accessibles par Voiture.Vehicule et Voiture.Camion (en cas d'import Voiture), ou Vehicule et Camion en cas de from Voiture import */from Voiture import Vehicule Camion (la 1ere syntaxe (import Voiture) etant un peu plus dure a ecrire mais evitant bien des problemes/erreurs, comparable au systeme de Namespaces en C++)
 
Ah oui, à tester mais je doute fortement que le python accepte des variables membres et des fonctions membres de meme nom (marque, en fait je viens de tester, il cree la variable STR mais pas la fonction)
et toute fonction membre d'une classe doit comporter au moins l'argument "self" qui permet d'en referer a l'objet dont la méthode est membre, et l'initialisation des variables de départ doit se faire dans __init__(self) (comparable au constructeur en C++), sinon ca plante
 
Et enfin, self.demarree je pense que c'est simplement pour savoir si la voiture est a l'arret ou pas, donc un booleen me semble plus indique
 
Finissons sur un conseil: tapes toi Dive Into Python (http://diveintopython.org) en t'aidant du chm Python, c'est gratuit (donc pourquoi s'en priver?) et franchement pas mal fait & intéressant


Message édité par masklinn le 26-07-2004 à 12:32:40

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°826087
yo c spi
Yo !
Posté le 18-08-2004 à 20:38:04  profilanswer
 

Masklinn a écrit :

question: pourquoi 8 espaces par tab? (habituellement c'est 4)

C'est mon éditeur qui fait ca (JEdit) et j'ai changé depuis.
 

Masklinn a écrit :

Finissons sur un conseil: tapes toi Dive Into Python (http://diveintopython.org) en t'aidant du chm Python, c'est gratuit (donc pourquoi s'en priver?) et franchement pas mal fait & intéressant

Merci pour le lien, ca a l'air pas mal du tout. Je regrette quand meme la doc Java a laquelle j'étais habitué.
 
Au fait, je viens de voir ca, mais je trouve bizarre la gestion de la portée des variables.


---------------
J.C. Farinet
mood
Publicité
Posté le 18-08-2004 à 20:38:04  profilanswer
 

n°826111
chaica
Posté le 18-08-2004 à 21:10:35  profilanswer
 

yo c spi a écrit :

C'est mon éditeur qui fait ca (JEdit) et j'ai changé depuis.
 
Merci pour le lien, ca a l'air pas mal du tout. Je regrette quand meme la doc Java a laquelle j'étais habitué.
 
Au fait, je viens de voir ca, mais je trouve bizarre la gestion de la portée des variables.


 
http://www.python.org/doc/current

n°826499
masklinn
í dag viðrar vel til loftárása
Posté le 19-08-2004 à 10:00:07  profilanswer
 

yo c spi a écrit :


Au fait, je viens de voir ca, mais je trouve bizarre la gestion de la portée des variables.


?
que vois tu de bizarre dans la portée des variables?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°827988
yo c spi
Yo !
Posté le 20-08-2004 à 18:08:39  profilanswer
 

Masklinn a écrit :

?
que vois tu de bizarre dans la portée des variables?


Dans ta version de code, tes variables de classe (marques, roues ...) sont déclarées dans une fonction (le constructeur), mais elles sont accessibles dans les autres fonctions. Les variables locales déclarées sont donc en fait des variables de classe. Ceci est peut etre du a l'utilisation explicite du self qui évite toute ambiguité.
Mais ce qui m'a troublé, c'est aussi, qu'il n'y a pas de réelles "déclarations" de variables, que la déclaration et l'initialisation sont implicites.


Message édité par yo c spi le 20-08-2004 à 18:43:05

---------------
J.C. Farinet
n°833260
masklinn
í dag viðrar vel til loftárása
Posté le 26-08-2004 à 20:59:51  profilanswer
 

yo c spi a écrit :

Dans ta version de code, tes variables de classe (marques, roues ...) sont déclarées dans une fonction (le constructeur), mais elles sont accessibles dans les autres fonctions. Les variables locales déclarées sont donc en fait des variables de classe. Ceci est peut etre du a l'utilisation explicite du self qui évite toute ambiguité.


le self désigne la portée objet et non locale, si il y a self alors c'est un membre de la classe (et donc accessible de partout dans l'instance courante de la classe)
 
Le rôle de l'argument self dans les fonctions est identique, toute fonction membre d'un objet (méthode) doit posséder un argument self (en fait tu pourrais l'appeler frublux98 si ca t'amusait, mais pour des raisons de simplicité on l'appelle toujours self) qui permet de faire référence à l'objet dont la méthode est membre (et donc d'avoir accès aux autres méthodes/membres, c'est l'équivalent du (*this) du C++)

Citation :

Mais ce qui m'a troublé, c'est aussi, qu'il n'y a pas de réelles "déclarations" de variables, que la déclaration et l'initialisation sont implicites.


Ben c'est du Python, typage implicite donc si tu n'as pas à déclarer explicitement le type pourquoi voudrais tu faire une déclaration de variable avant de commencer à l'utiliser?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody

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

  TypeError: 'module' object is not callable

 

Sujets relatifs
Module MSN Messengerforum php et module d'identification
[Python ] Module CGIHTTPServer[Python] TypeError sur une concaténation de chaines [Résolu]
Lister toutes les fonctions et classes d' un moduleProblème d' installation d' un module perl avec CPAN
C'est quoi l'object target?[javascript]file system object
Coder module d'authenfication via LDAP avec IIScomment installer un module perl sur windows
Plus de sujets relatifs à : TypeError: 'module' object is not callable


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