我正在查看 django 中的模型系统是如何工作的,我发现了一些我不明白的地方.
I'm taking a look at how the model system in django works and I noticed something that I don't understand.
我知道你创建了一个空的 __init__.py 文件来指定当前目录是一个包.并且您可以在 __init__.py 中设置一些变量,以便 import * 正常工作.
I know that you create an empty __init__.py file to specify that the current directory is a package. And that you can set some variable in __init__.py so that import * works properly.
但是django在__init__.py中添加了一堆from ... import ...语句并定义了一堆类.为什么?这不是让事情看起来很乱吗?__init__.py 中是否有需要此代码的原因?
But django adds a bunch of from ... import ... statements and defines a bunch of classes in __init__.py. Why? Doesn't this just make things look messy? Is there a reason that requires this code in __init__.py?
当你导入包含它的包(目录)时,__init__.py 中的所有导入都可用.
All imports in __init__.py are made available when you import the package (directory) that contains it.
例子:
./dir/__init__.py:
import something
./test.py:
import dir
# can now use dir.something
忘了提一下,__init__.py 中的代码在您第一次从该目录导入任何模块时运行.所以它通常是放置任何包级初始化代码的好地方.
forgot to mention, the code in __init__.py runs the first time you import any module from that directory. So it's normally a good place to put any package-level initialisation code.
dgrant 在我的示例中指出了可能的混淆.在 __init__.py import something 可以导入任何模块,不需要从包中导入.例如,我们可以将其替换为 import datetime,然后在我们的顶级 test.py 中,这两个片段都可以工作:
dgrant pointed out to a possible confusion in my example. In __init__.py import something can import any module, not necessary from the package. For example, we can replace it with import datetime, then in our top level test.py both of these snippets will work:
import dir
print dir.datetime.datetime.now()
和
import dir.some_module_in_dir
print dir.datetime.datetime.now()
底线是:在 __init__.py 中分配的所有名称,无论是导入的模块、函数还是类,在您导入包或包中的模块时自动在包命名空间中可用.
The bottom line is: all names assigned in __init__.py, be it imported modules, functions or classes, are automatically available in the package namespace whenever you import the package or a module in the package.
这篇关于将代码添加到 __init__.py的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
python:不同包下同名的两个模块和类python: Two modules and classes with the same name under different packages(python:不同包下同名的两个模块和类)
配置 Python 以使用站点包的其他位置Configuring Python to use additional locations for site-packages(配置 Python 以使用站点包的其他位置)
如何在不重复导入顶级名称的情况下构造python包How to structure python packages without repeating top level name for import(如何在不重复导入顶级名称的情况下构造python包)
在 OpenShift 上安装 python 包Install python packages on OpenShift(在 OpenShift 上安装 python 包)
如何刷新 sys.path?How to refresh sys.path?(如何刷新 sys.path?)
分发带有已编译动态共享库的 Python 包Distribute a Python package with a compiled dynamic shared library(分发带有已编译动态共享库的 Python 包)