首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >向__init__.py添加代码

向__init__.py添加代码
EN

Stack Overflow用户
提问于 2008-09-23 04:41:18
回答 2查看 69.1K关注 0票数 94

我正在看django中的模型系统是如何工作的,我注意到了一些我不理解的东西。

我知道您创建了一个空的__init__.py文件来指定当前目录是一个包。并且您可以在__init__.py中设置一些变量,以便import *正常工作。

但是django增加了一堆来自..。导入...语句,并在__init__.py中定义了一堆类。为什么?这不是让事情看起来很混乱吗?是否有需要在__init__.py中使用此代码的原因

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中分配的所有名称,无论是导入的模块、函数还是类,都会自动在包命名空间中可用。

票数 78
EN

Stack Overflow用户

发布于 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

从外面看,这个包看起来和以前完全一样。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/119167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档