我正在看django中的模型系统是如何工作的,我注意到了一些我不理解的东西。
我知道您创建了一个空的__init__.py
文件来指定当前目录是一个包。并且您可以在__init__.py
中设置一些变量,以便import *正常工作。
但是django增加了一堆来自..。导入...语句,并在__init__.py
中定义了一堆类。为什么?这不是让事情看起来很混乱吗?是否有需要在__init__.py
中使用此代码的原因
发布于 2008-09-23 04:47:51
当您导入包含它的包(目录)时,__init__.py
中的所有导入都可用。
示例:
./dir/__init__.py
import something
./test.py
import dir
# can now use dir.something
编辑:忘了提一下,__init__.py
中的代码在您第一次从该目录导入任何模块时运行。所以这通常是一个放置任何包级初始化代码的好地方。
EDIT2: dgrant指出了我的示例中可能存在的混淆。在__init__.py
中,import something
可以导入任何模块,而不需要从包中导入。例如,我们可以用import datetime
替换它,然后在我们的顶级test.py
中,这两个片段都可以工作:
import dir
print dir.datetime.datetime.now()
和
import dir.some_module_in_dir
print dir.datetime.datetime.now()
底线是:每当您导入包或包中的模块时,在__init__.py
中分配的所有名称,无论是导入的模块、函数还是类,都会自动在包命名空间中可用。
发布于 2008-09-24 11:02:56
使用__init__.py
文件可以使内部包结构从外部不可见。如果内部结构发生变化(例如,因为您将一个fat模块一分为二),您只需调整__init__.py
文件,而不需要调整依赖于包的代码。您还可以使包的某些部分不可见,例如,如果它们未准备好供一般使用。
请注意,您可以使用del
命令,因此典型的__init__.py
可能如下所示:
from somemodule import some_function1, some_function2, SomeObject
del somemodule
现在,如果您决定拆分somemodule
,则新的__init__.py
可能是:
from somemodule1 import some_function1, some_function2
from somemodule2 import SomeObject
del somemodule1
del somemodule2
从外面看,这个包看起来和以前完全一样。
https://stackoverflow.com/questions/119167
复制相似问题