python在导入模块时遇到更多麻烦

python在导入模块时遇到更多麻烦,python,python-module,python-import,Python,Python Module,Python Import,昨天我问了一个类似的问题,但从那以后我遇到了一个非常奇怪的问题。使用此目录结构: app/ models/ __init__.py user.py other.py pages/ __init__.py pages.py models/\uuuu init\uuuu.py文件包含以下行: __all__ = ['user', 'other'] 而pages/\uuuu init\uuuuu.py已

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

app/
    models/
        __init__.py
        user.py
        other.py
    pages/
        __init__.py
        pages.py
models/\uuuu init\uuuu.py文件包含以下行:

__all__ = ['user', 'other']
而pages/\uuuu init\uuuuu.py已经

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

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

my_user = models.user.User()
如果排除顶部的任何一条import-ing语句,就会出现如下错误

"Class user has no attribute User"

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

有两个选项,这取决于您希望显式的位置以及“默认情况下”(这也意味着强制)的可用性

import models.user
在这些初始化文件中,您可以使用:

# models/__init__.py shown:
import user, other                 # ambiguous relative import
from . import user, other          # relative import
from app.models import user, other # absolute import
或者,如果您只需要导入模型,请使用:

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

后一种形式更受欢迎。

当您学习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'>
>>dir()
[“内置”、“文件”、“名称”、“包装”]
>>>导入模型
>>>处长(模型)
[“所有”、“内置”、“文档”、“文件”、“名称”、“包”、“路径”]
>>>模型用户
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“模块”对象没有属性“用户”
>>>从模型导入*
>>>目录()
[“内置”、“文档”、“名称”、“包”、“模型”、“其他”、“用户”]
>>>处长(模型)
[“所有”、“内置”、“文档”、“文件”、“名称”、“包”、“路径”、“其他”、“用户”]
>>>使用者
>>>模型用户
>>>用户,用户

更新:固定输出

这是我第一次听到有人说他们希望Python像PHP一样工作……哈,是的,这也是我第一次这么说……你的模型的内容是什么?如问题所述,
导入模型;型号。用户将给出AttributeError。(您的示例是否在models/\uuu init\uuuuuuuuuuuuuuuuy.py中有
导入用户
?这可以解释您的不同结果。)@Roger-my models/\uuuuuuuuu init\uuuuuuuuuuuuuuuuuuy只是
\uuuuuuu all.['user',other']
。然后我希望您得到我得到的结果:。您是否有早期的
导入模型用户
或类似用户?(该导入将修改模型模块对象。)当我只使用导入模型或从模型导入*并运行dir(models)时,我得到“['all'、'builtins'、'doc'、'file'、'name'、'package'、'path']”。我必须同时拥有这两条语句,才能包含用户和其他用户。@罗杰,我明白问题出在哪里了。从models import*
中执行
时,我在本地范围内有一些剩余内容。修正了。我从app.models导入了
,其他的
,效果很好,谢谢