TypeError: 'module' object is not callable

TypeError: 'module' object is not callable - Python - Programmation

Marsh Posté le 24-07-2004 à 11:34:02    

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
Reply

Marsh Posté le 24-07-2004 à 11:34:02   

Reply

Marsh Posté le 24-07-2004 à 11:37:56    

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()

Reply

Marsh Posté le 24-07-2004 à 11:41:12    

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


---------------
J.C. Farinet
Reply

Marsh Posté le 24-07-2004 à 11:43:14    

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

Reply

Marsh Posté le 24-07-2004 à 11:56:00    

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
Reply

Marsh Posté le 24-07-2004 à 12:03:16    

tu confonds module et package

Reply

Marsh Posté le 24-07-2004 à 12:12:44    

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
Reply

Marsh Posté le 26-07-2004 à 11:52:39    

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
Reply

Marsh Posté le 26-07-2004 à 12:14:03    

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
Reply

Marsh Posté le 18-08-2004 à 20:38:04    

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
Reply

Marsh Posté le 18-08-2004 à 20:38:04   

Reply

Marsh Posté le 18-08-2004 à 21:10:35    

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

Reply

Marsh Posté le 19-08-2004 à 10:00:07    

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
Reply

Marsh Posté le 20-08-2004 à 18:08:39    

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
Reply

Marsh Posté le 26-08-2004 à 20:59:51    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed