__init__.py的目的。或者:为什么将代码放在__init__.py中而不是模块中?

时间:2018-09-13 15:15:48

标签: python django

我正在查看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的用途是什么?

1 个答案:

答案 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()

有效。