Подтвердить что ты не робот

Объект 'module' не вызываем - метод вызова в другом файле

У меня есть хороший опыт в java, пытаясь выучить python. У меня возникла проблема с пониманием того, как обращаться к методам из других классов, когда они находятся в разных файлах. Я продолжаю получать объект модуля не вызываемым.

Я сделал простую функцию, чтобы найти самое большое и наименьшее целое число в списке в одном файле и хочу получить доступ к этим функциям в другом классе в другом файле.

Любая помощь приветствуется, спасибо.

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' )
4b9b3361

Ответ 1

Проблема в строке import. Вы импортируете модуль, а не класс. Предполагая, что ваш файл называется other_file.py (в отличие от java, опять же, нет такого правила, как "один класс, один файл"):

from other_file import findTheRange

если ваш файл также называется findTheRange, в соответствии с соглашениями Java, то вы должны написать

from findTheRange import findTheRange

Вы также можете импортировать его так же, как вы это сделали с random:

import findTheRange
operator = findTheRange.findTheRange()

Некоторые другие комментарии:

а) @Daniel Roseman прав. Вам не нужны занятия здесь вообще. Python поощряет процедурное программирование (когда оно подходит, конечно)

б) Вы можете создать список напрямую:

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

в) Вы можете вызывать методы так же, как в Java:

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

г) Вы можете использовать встроенную функцию и огромную библиотеку Python:

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

e) Если вы все еще хотите использовать класс, и вам не нужен self, вы можете использовать @staticmethod:

class findTheRange():
    @staticmethod
    def findLargest(_list):
        #stuff...

Ответ 2

  • from directory_of_modules вы можете import specific_module.py
  • этот specific_module.py, может содержать Class с some_methods() или просто functions()
  • из файла specific_module.py вы можете создать экземпляр Class или вызвать functions()
  • из этого Class вы можете выполнить some_method()

Пример:

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

Выдержки из PEP 8 - Руководство по стилю для кода Python:

Модули должны иметь короткие и строчные имена.

Примечание: подчеркивания могут использоваться в имени модуля, если это улучшает удобочитаемость.

Модуль Python - это просто исходный файл (*. Py), который может предоставлять:

  • Класс: имена, использующие соглашение "CapWords".

  • Функция: имена в нижнем регистре, слова, разделенные подчеркиванием.

  • Глобальные переменные: соглашения примерно такие же, как и для функций.