Python >> Tutoriel Python >  >> Python

typeerror :l'objet module n'est pas appelable

Cette déclaration d'erreur TypeError :l'objet 'module' n'est pas appelable est déclenché car vous êtes confus au sujet du nom de la classe et du nom du module. Le problème est dans la ligne d'importation . Vous importez un module, pas une classe. Cela s'est produit parce que le nom du module et le nom de la classe ont le même nom .

Si vous avez une classe MyClass dans un fichier appelé MyClass.py , alors vous devez écrire :

from MyClass import MyClass

Comment corriger l'erreur de type :l'objet 'module' n'est pas appelable

L'exemple Python suivant montre que vous avez une classe nommée MyClass dans un fichier MaClasse.py . Si vous importez le module "MyClass" dans un autre fichier python sample.py , python ne voit que le module "MyClass" et non le nom de classe "MyClass" déclaré dans ce module.

MaClasse.py

class MyClass:
  myVar = 10

exemple.py

import MyClass
obj = MyClass();
print(obj.myVar);

Lorsque vous exécutez le sample.py , vous obtiendrez l'erreur suivante.

D:\python\dev>python sample.py
Traceback (most recent call last):
  File "sample.py", line 4, in 
    obj = MyClass();
TypeError: 'module' object is not callable

En Python , un script est un module, dont le nom est déterminé par le filename . Ainsi, lorsque vous démarrez votre fichier MyClass.py avec import MyClass, vous créez une boucle dans la structure du module.

l'objet 'module' n'est pas appelable

Vous pouvez corriger cette erreur en modifiant l'instruction d'importation dans sample.py

exemple.py

from MyClass import MyClass
obj = MyClass();
print(obj.myVar);

Ici, vous pouvez voir quand vous avez changé l'instruction d'importation en from MyClass import MyClass , vous obtiendrez l'erreur corrigée.

En Python, tout (y compris les fonctions, les méthodes, les modules, les classes, etc.) est un objet , et les méthodes ne sont que des attributs comme tous les autres. Il n'y a donc pas d'espaces de noms séparés pour les méthodes. Ainsi, lorsque vous définissez un attribut d'instance, il masque l'attribut de classe du même nom. La solution évidente est de donner aux attributs des noms différents .