Объект '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' )
Ответы
Ответ 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".
-
Функция: имена в нижнем регистре, слова, разделенные подчеркиванием.
-
Глобальные переменные: соглашения примерно такие же, как и для функций.