2010-02-18 126 views
1

昨天我问了一个类似的问题,但自那时起就遇到了一个很奇怪的问题。有了这个目录结构:蟒蛇更麻烦导入模块

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

的模型/ __ 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() 

如果我排除任何进口-ING语句的顶部,我得到这样的错误

"Class user has no attribute User" 

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

+3

这是我第一次听到有人说他们希望Python像PHP一样工作... – voyager 2010-02-18 17:26:52

+0

哈,是啊这是我第一次说... – 2010-02-18 18:15:48

回答

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 

后一种形式更广泛的首选。

+0

我把'app.models导入用户,其他',它的效果很好,谢谢 – 2010-02-18 18:42:14

0
import models.user 
1

一两件事,可当你学习蟒蛇(或调试)真正有帮助的,是交互式运行,并使用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'> 

更新:固定输出。

+0

你的模型的内容是什么/ \ _ \ _ init \ _ \ _。py?正如问题所述,“进口模型; models.user'会给出一个AttributeError。 (您的示例在models/\ _ \ _ init \ _ \ _。py中有'import user'这会解释您的不同结果。) – 2010-02-18 17:32:32

+0

@Roger - my models/__ init__.py只是'__all__ = ['user' ,'other']'。 – Seth 2010-02-18 17:40:04

+0

然后,我希望你得到我得到的:http://codepad.org/yWnKyVAW。你有更早的'import models.user'或类似吗? (该导入将修改模型模块对象。) – 2010-02-18 18:23:13