python导入模块更麻烦

时间:2010-02-18 17:09:41

标签: python python-module python-import

昨天我问了一个类似的问题,但从那时起就收到了一个非常奇怪的问题。使用此目录结构:

app/
    models/
        __init__.py
        user.py
        other.py
    pages/
        __init__.py
        pages.py

models / __ init__.py文件包含以下行:

__all__ = ['user', 'other']

并且页面/ __ init__.py有

__all__ = ['pages']

在pages.py中,为了使用user.py或other.py中的任何类,我必须

from models import *
import models

在顶部,然后我可以声明一个User类,如下所示:

my_user = models.user.User()

如果我排除了顶部的任何导入语句,我会收到类似

的错误
"Class user has no attribute User"

任何帮助将不胜感激。我喜欢Python,但我希望它的导入功能更像PHP。

3 个答案:

答案 0 :(得分:2)

有两种选择,具体取决于您希望显式的位置以及“默认情况下”可用的数量(这也意味着强制)。

在那些__init__文件中,您可以使用:

# models/__init__.py shown:
import user, other                 # ambiguous relative import
from . import user, other          # relative import
from app.models import user, other # absolute import

或者,如果您只有import models,请使用:

from models import user, other
# or:
import models.user, models.other

后一种形式更为广泛。

答案 1 :(得分:1)

当你学习python(或调试)时,有一件事可以真正有用,就是以交互方式运行并使用dir()函数来查看生活在哪里:

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> import models
>>> dir(models)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> models.user
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'user'
>>> from models import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'models', 'other', 'user']
>>> dir(models)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__','__path__', 'other', 'user']
>>> user
<module 'models.user' from 'C:\test\models\user.py'>
>>> models.user
<module 'models.user' from 'C:\test\models\user.py'>
>>> user.User
<class 'models.user.User'>

更新:固定输出。

答案 2 :(得分:0)

import models.user