昨天我问了一个类似的问题,但从那时起就收到了一个非常奇怪的问题。使用此目录结构:
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。
答案 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