web-dev-qa-db-fra.com

L'objet 'module' n'est pas appelable - méthode d'appel dans un autre fichier

J'ai une bonne expérience de Java et j'essaie d'apprendre le python. Je rencontre un problème pour comprendre comment accéder aux méthodes d'autres classes lorsqu'elles se trouvent dans des fichiers différents. Je continue à avoir un objet module n'est pas appelable.

J'ai créé une fonction simple pour rechercher le plus grand et le plus petit entier d'une liste dans un fichier et pour accéder à ces fonctions dans une autre classe d'un autre fichier.

Toute aide est appréciée, merci.

class findTheRange():

    def findLargest(self, _list):
        candidate = _list[0]
        for i in _list:
            if i > candidate:
                candidate = i
        return candidate

    def findSmallest(self, _list):
        candidate = _list[0]
        for i in _list:
            if i < candidate:
                candidate = i
        return candidate

 import random
 import findTheRange

 class Driver():
      numberOne = random.randint(0, 100)
      numberTwo = random.randint(0,100)
      numberThree = random.randint(0,100)
      numberFour = random.randint(0,100)
      numberFive = random.randint(0,100)
      randomList = [numberOne, numberTwo, numberThree, numberFour, numberFive]
      operator = findTheRange()
      largestInList = findTheRange.findLargest(operator, randomList)
      smallestInList = findTheRange.findSmallest(operator, randomList)
      print(largestInList, 'is the largest number in the list', smallestInList, 'is the                smallest number in the list' )
39

Le problème est dans la ligne import. Vous importez un module, pas une classe. En supposant que votre fichier s'appelle other_file.py (contrairement à Java, là encore, il n’existe pas de règle du type "une classe, un fichier"):

from other_file import findTheRange

si votre fichier s'appelle également findTheRange, à la suite des conventions Java, alors vous devriez écrire

from findTheRange import findTheRange

vous pouvez également l'importer comme vous l'avez fait avec random:

import findTheRange
operator = findTheRange.findTheRange()

Quelques autres commentaires:

a) @ Daniel Roseman a raison. Vous n'avez pas du tout besoin de cours ici. Python encourage la programmation procédurale (quand cela convient, bien sûr)

b) Vous pouvez construire la liste directement:

  randomList = [random.randint(0, 100) for i in range(5)]

c) Vous pouvez appeler des méthodes comme vous le faites en Java:

largestInList = operator.findLargest(randomList)
smallestInList = operator.findSmallest(randomList)

d) Vous pouvez utiliser la fonction intégrée et l’énorme bibliothèque python:

largestInList = max(randomList)
smallestInList = min(randomList)

e) Si vous voulez toujours utiliser une classe et que vous n'avez pas besoin de self, vous pouvez utiliser @staticmethod:

class findTheRange():
    @staticmethod
    def findLargest(_list):
        #stuff...
70
Elazar
  • from a directory_of_modules, vous pouvez import a specific_module.py
  • ce specific_module.py peut contenir un Class avec some_methods() ou seulement functions()
  • à partir d'un specific_module.py, vous pouvez instancier un Class ou appeler functions()
  • à partir de ce Class, vous pouvez exécuter some_method()

Exemple:

#!/usr/bin/python3
from directory_of_modules import specific_module
instance = specific_module.DbConnect("username","password")
instance.login()

Extraits de PEP 8 - Guide de style pour Python Code :

Les modules doivent avoir des noms courts et minuscules.

Remarque: Les caractères de soulignement peuvent être utilisés dans le nom du module si cela améliore la lisibilité.

Un module Python est simplement un fichier source (*. Py), qui peut exposer:

  • Class: noms utilisant la convention "CapWords".

  • Fonction: noms en minuscules, mots séparés par des traits de soulignement.

  • Variables globales: les conventions sont à peu près les mêmes que celles des fonctions.

2
ivanleoncz