1

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

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()

如果我排除顶部的任何一个 import-ing 语句,我会收到类似的错误

"Class user has no attribute User"

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

4

3 回答 3

1
import models.user
于 2010-02-18T17:13:46.213 回答
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

后一种形式是更广泛优选的。

于 2010-02-18T17:15:43.070 回答
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'>

更新:固定输出。

于 2010-02-18T17:25:33.330 回答