我正在查看Django的代码。它具有以下软件包:
➜ django pwd
/Users/ugur/.virtualenvs/evernote/lib/python3.6/site-packages/django
➜ django tree -L 1
.
├── __init__.py
├── __main__.py
├── __pycache__
├── apps
├── bin
├── conf
├── contrib
├── core
├── db
├── dispatch
├── forms
├── http
├── middleware
├── shortcuts.py
├── template
├── templatetags
├── test
├── urls
├── utils
└── views
现在,我深入研究db/
中的软件包,并尝试了解其结构。
创建模型时我经常使用的类例如:
models.CharField
models.TextField
models.IntegerField
在尝试查看其代码时,我很惊讶地在以下位置找到它们:
db/models/fields/__init__.py
查看该__init__.py
文件,发现> 2300行代码。
我使用__init__.py
文件向解释器指示文件夹是要包含模块的程序包。
此外,通过dir(myobject)
检查对象的属性,我可以看到__file__
属性指向__init__.py
文件。例如dir(django)
:
In [5]: dir(django)
Out[5]:
['VERSION',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__path__',
'__spec__',
'__version__',
'get_version',
'setup', 'utils']
## so `django.__file__` equals to ./django/__init__.py`
##
In [6]: django.__file__
Out[6]: '/Users/ugur/.virtualenvs/evernote/lib/python3.6/site-packages/django/__init_
_.py'
In [7]: django.__package__
Out[7]: 'django'
In [8]:
此文件__init__.py
的用途是什么?
答案 0 :(得分:1)
假设您的布局如下:
my_package/
__init__.py
my_module.py
然后空白的__init__.py
将要求您写
import my_package.my_module
my_package.my_module.hello()
但是您可以将可执行代码放到__init__.py
中执行的import my_package
中。
例如,如果您放置
# __init__.py
import my_module
进入__init__.py
,您现在可以简化导入:
import my_package
my_package.my_module.hello()
您可以进一步修改__init__.py
:
# __init__.py
from my_module import hello
这样
import my_package
my_package.hello()
有效。