TypeError: 'module' object is not callable - Python - Programmation
Marsh Posté le 24-07-2004 à 11:37:56
Voiture c'est le module
Voiture.Voiture c'est la classe
dis-donc, tu ferais bien de réviser et de jouer un peu avec dir()
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)
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
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)
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
Marsh Posté le 26-07-2004 à 11:52:39
Corrections dans le texte:
Code :
|
Voiture.py :
Code :
|
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.
Marsh Posté le 26-07-2004 à 12:14:03
j'aurais même mis:
Code :
|
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
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.
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. |
http://www.python.org/doc/current
Marsh Posté le 19-08-2004 à 10:00:07
yo c spi a écrit : |
?
que vois tu de bizarre dans la portée des variables?
Marsh Posté le 20-08-2004 à 18:08:39
Masklinn 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é.
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.
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?
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
Voiture.py :
Comme vous pouvez le voir c'est tout simple, mais ca bloque.
merci
---------------
J.C. Farinet