модуль не имеет атрибута - PullRequest
41 голосов
/ 17 января 2012

У меня есть каталог с количеством файлов .py.каждый файл определяет несколько классов.У меня также есть пустой __init__.py в каталоге.

Например:

myproject
    __init__.py
    mymodule
        __init__.py
        api.py
        models.py
        views.py

Я пытаюсь импортировать mymodule и получить доступ к классам, определенным во всех этих файлах:

from myproject import mymodule

print mymodule.api.MyClass 

Выдает ошибку, в которой говорится, что mymodule не имеет атрибута api.Зачем?И почему я могу получить доступ только к одному из файлов (models.py), а не к остальным?

In [2]: dir(banners)
Out[2]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 '__path__',
 'models']

Ответы [ 3 ]

40 голосов
/ 17 января 2012

Проблема в том, что субмодули не импортируются автоматически.Вы должны явно импортировать модуль api:

import myproject.mymodule.api
print myproject.mymodule.api.MyClass

Если вы действительно настаиваете на доступности api при импорте myproject.mymodule, вы можете поместить это в myproject/mymodule/__init__.py:

import myproject.mymodule.api

Тогда это будет работать как ожидалось:

from myproject import mymodule

print mymodule.api.MyClass 
2 голосов
/ 17 января 2012

Вам также нужно __init__.py в каталоге myproject.Таким образом, ваша структура модуля должна быть:

myproject
    __init__.py
    mymodule
        __init__.py
        api.py
        models.py
        views.py
1 голос
/ 17 января 2012

Модули так не работают.

from myproject.mymodule import api
print api.MyClass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...