2012-01-17 86 views
22

我有一个目录,其中有.py个文件。每个文件都定义了一些类。我在目录中也有一个空的__init__.py模块没有属性

例如:

myproject 
    __init__.py 
    mymodule 
     __init__.py 
     api.py 
     models.py 
     views.py 

我试图导入mymodule和访问所有这些文件中定义的类:

from myproject import mymodule 

print mymodule.api.MyClass 

它给了我一个错误,指出mymodule有没有属性api。为什么?为什么我只能访问其中一个文件(models.py)而不是其他文件?

In [2]: dir(banners) 
Out[2]: 
['__builtins__', 
'__doc__', 
'__file__', 
'__name__', 
'__package__', 
'__path__', 
'models'] 

回答

28

问题是子模块不会自动导入。你必须明确地导入api模块:

import myproject.mymodule.api 
print myproject.mymodule.api.MyClass 

如果你真的坚持api进口myproject.mymodule时,你可以把这个myproject/mymodule/__init__.py是可用:

import myproject.mymodule.api 

然后按预期这将工作:

from myproject import mymodule 

print mymodule.api.MyClass 
1

模块不能这样工作。

from myproject.mymodule import api 
print api.MyClass 
+0

我知道我可以做到这一点。是否可以使用虚线名称? – akonsu 2012-01-17 17:47:42

+2

@akonsu,只需执行'import myproject.mymodule.api',然后通过'myproject.mymodule.api.MyClass'访问它。 – 2012-01-17 17:50:57

+0

好吧,我认为这是一个关于一般语言的问题,而不是关于如何让我的代码工作。我很好奇这是否可以实现。我可以通过'mymodule.api ...'来访问我的课程吗?没有领先的'myproject'? – akonsu 2012-01-17 17:53:23

2

您还需要myproject目录中的__init__.py。所以你的模块结构应该是:

myproject 
    __init__.py 
    mymodule 
     __init__.py 
     api.py 
     models.py 
     views.py 
+1

是的,谢谢我有它,只是从问题中省略。 – akonsu 2012-01-17 17:50:21

相关问题