文件结构;
./__init__.py
a.py
/lib
__init__.py
Foo1.py # contains `class Foo1`
Foo2.py # contains `class Foo2`
# so on ...
在a.py
中对此进行了测试,并且正在执行此操作;
from lib.Foo1 import Foo1
from lib.Foo2 import Foo2
但是,当我在from lib import *
__all__ = ["Foo1", "Foo2"]
__init__.py
时,它无法正常工作。
错误:<type 'exceptions.TypeError'>: 'module' object is not callable
我失踪了什么?
这是a.py
;
#!/usr/bin/python
import cgi, cgitb
cgitb.enable()
from lib import *
print "Content-Type: text/html"
print ""
print "Test!"
foo1 = Foo1()
foo2 = Foo2()
//使用此refs:
// http://docs.python.org/2/tutorial/modules.html#importing-from-a-package
// Loading all modules in a folder in Python
答案 0 :(得分:4)
from lib import *
将lib
中的所有内容导入当前模块,因此我们的globals()
如下所示:
{'Foo1':<module lib.Foo1>,
'Foo2':<module lib.Foo2>}
而
from lib.Foo1 import *
from lib.Foo2 import *
让globals()
成为
{'Foo1':<class lib.Foo1.Foo1>,
'Foo2':<class lib.Foo2.Foo2>}
所以在第一种情况下,我们只是导入模块,而不是我们想要的内部类。
答案 1 :(得分:2)
将以下内容添加到您的... / lib / __ init__.py文件中:
from Foo1 import Foo1
from Foo2 import Foo1
__all__ = ['Foo1', 'Foo2']
请注意,PEP-8建议package and modules names be all lowercase以避免混淆。
答案 2 :(得分:2)
从软件包导入*
时(在您的情况下,使用__all__
中的init.py
)__all__
指定所有要加载并导入当前模块的模块命名空间。
因此,在您的情况下,from lib import *
将导入模块Foo1
和Foo2
,您需要像这样访问类:
foo1 = Foo1.Foo1()
foo2 = Foo2.Foo2()
请查看Importing *
in Python以获得快速说明。