#python #python-3.x
#python #python-3.x
Вопрос:
Я новичок в python и просмотрел различные сообщения о переполнении стека. я чувствую, что это должно сработать, но это не так. Как импортировать класс из другого файла в python? Эта структура папок
src/example/ClassExample
src/test/ClassExampleTest
У меня есть этот класс
class ClassExample:
def __init__(self):
pass
def helloWorld(self):
return "Hello World!"
У меня есть этот тестовый класс
import unittest
from example import ClassExample
class ClassExampleTest(unittest.TestCase):
def test_HelloWorld(self):
hello = ClassExample()
self.assertEqual("Hello World!", hello.helloWorld())
if __name__ == '__main__':
unittest.main()
При выполнении модульного теста объект равен None:
Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘HelloWorld’
Что в этом плохого? Как импортировать класс в python?
Комментарии:
1. Попытайтесь
import example; print(example)
увидеть, что вы действительно импортировалиexample
модуль, а не другой модуль, который находится в пути импорта python.2. Я не понимаю, как
hello
может быть None.3. Приведенный здесь код выглядит разумно. Убедитесь, что вы импортируете из правильного файла. Измените имена файлов, чтобы убедиться, что вы не читаете из неправильного файла.
4. когда я делаю то, что говорит @falsetru, он печатает «<модуль ‘пример’ из ‘/Users/thomas/.pyenv/versions/3.6.1/lib/python3.6/site-packages/example/__init__.py ‘>»
5. Похоже, что модуль site-package example на самом деле имеет класс «ClassExample». Каковы шансы??
Ответ №1:
Если вы используете Python 3, то импорт по умолчанию является абсолютным. Это означает, что import example
будет искать абсолютный пакет с именем example
, где-то в пути поиска модуля.
Поэтому вместо этого вы, вероятно, хотите относительный импорт. Это полезно, когда вы хотите импортировать модуль, который является относительным модулем, выполняющим импорт. В этом случае:
from ..example.ClassExample import ClassExample
Я предполагаю, что ваши папки представляют собой пакеты Python, что означает, что они содержат __init__.py
файлы. Таким образом, ваша структура каталогов будет выглядеть следующим образом.
src
|-- __init__.py
|-- example
| |-- __init__.py
| |-- ClassExample.py
|-- test
| |-- __init__.py
| |-- ClassExampleTest.py
Комментарии:
1. Я попробовал это. Я получаю:
TypeError: 'module' object is not callable
2. Ах. У вас есть свой класс внутри файла с именем
ClassExample.py
?3. Относительный импорт не работает для сценариев (например, для этого сценария модульного тестирования), только для пакетов и модулей. Скрипты не находятся в пакетах, поэтому не к чему относиться.
4. ДА. Вот и все, Николас
5. @Dan, в этом случае вам нужно
from .example.ClassExample import ClassExample