【问题标题】:python more trouble importing modulespython导入模块比较麻烦
【发布时间】:2011-01-18 10:27:22
【问题描述】:

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

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

models/__init__.py 文件有这一行:

__all__ = ['user', 'other']

pages/__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。

【问题讨论】:

  • 这是我第一次听到有人说他们希望 Python 像 PHP 一样工作......
  • 哈,是的,我也是第一次这么说……

标签: python python-module python-import


【解决方案1】:

有两个选项,具体取决于您希望在哪里明确以及您希望“默认”可用多少(这也意味着强制)。

在您可以使用的 __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

后一种形式更受欢迎。

【讨论】:

  • 我输入了from app.models import user, other,效果很好,谢谢
【解决方案2】:
import models.user

【讨论】:

    【解决方案3】:

    当您学习 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'>
    

    更新:固定输出。

    【讨论】:

    • 你的models/__init__.py的内容是什么?正如问题所述,import models; models.user 将给出 AttributeError。 (您的样本在 models/__init__.py 中有 import user 吗?这可以解释您的不同结果。)
    • @Roger - 我的模型/__init__.py 只是 __all__ = ['user', 'other']
    • 那么我希望你能得到我所得到的:codepad.org/yWnKyVAW。你有更早的import models.user 或类似的吗? (该导入将修改模型模块对象。)
    • 当我只使用 import models or from models import * 并运行 dir(models) 我得到 "['all', 'builtins', 'doc', 'file', 'name', 'package ', '路径']"。我必须同时拥有这两个语句才能包含用户和其他语句。
    • @Roger 我明白了现在的问题所在。我在做from models import * 时在本地范围内有剩菜。修好了。
    猜你喜欢
    • 2018-12-06
    • 1970-01-01
    • 2017-04-10
    • 2012-11-05
    • 2020-02-13
    • 2012-08-23
    • 2014-06-28
    • 2018-07-04
    • 2023-04-03
    相关资源
    最近更新 更多