澳门至尊网站-首页

您的位置:澳门至尊网站 > 免费资源 > Python小说: __init__.py的功能

Python小说: __init__.py的功能

2019-10-24 02:17

  大家经常在python的模块目录中会看见"__init__.py"  那些文件,那么它究竟有哪些效果吗?

 

1. 标记该目录是多少个python的模块包(module package)

  假使您是选取python的有关IDE来展开开采,那么大器晚成旦目录中留存该公文,该目录就能够被识别为 module package 。

2. 简化模块导入操作

  假如大家的模块包的目录结构如下:

.
└── mypackage
    ├── subpackage_1
    │   ├── test11.py
    │   └── test12.py
    ├── subpackage_2
    │   ├── test21.py
    │   └── test22.py
    └── subpackage_3
        ├── test31.py
        └── test32.py

   

  假诺大家使用最直白的导入格局,将整个文件拷贝到工程目录下,然后直接导入:

from mypackage.subpackage_1 import test11
from mypackage.subpackage_1 import test12
from mypackage.subpackage_2 import test21
from mypackage.subpackage_2 import test22
from mypackage.subpackage_3 import test31
from mypackage.subpackage_3 import test32

  当然这几个事例里面文件比非常少,纵然模块相当的大,目录比较深的话,大概本身都遗忘该怎么导入。(很有只怕,哪怕只想导入三个模块都要在目录中找十分久)

  这种气象下,__init__.py 就很有效应了。大家先来拜访该公文是何许做事的。

2.1 __init__.py 是怎么专业的?

  实际上,假设目录中富含了 __init__澳门至尊网站,.py 时,当用 import 导入该目录时,会施行 __init__.py 里面的代码。

  我们在mypackage目录下扩展三个 __init__.py 文件来做贰个实验:

.
└── mypackage
    ├── __init__.py
    ├── subpackage_1
    │   ├── test11.py
    │   └── test12.py
    ├── subpackage_2
    │   ├── test21.py
    │   └── test22.py
    └── subpackage_3
        ├── test31.py
        └── test32.py

  mypackage/__init__.py 里面加贰个print,假设试行了该公文就能输出:

print("You have imported mypackage")

  上面间接用交互形式开展 import

>>> import mypackage
You have imported mypackage

  很显然,__init__.py 在包被导入时会被实施。

2.2  调控模块导入

  大家再做二个实行,在 mypackage/__init__.py 增添以下语句:

from subpackage_1 import test11

  大家导入 mypackage 试试:

>>> import mypackage
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/taopeng/Workspace/Test/mypackage/__init__.py", line 2, in <module>
    from subpackage_1 import test11
ImportError: No module named 'subpackage_1'

  报错了。。。怎么回事?

  原本,在大家实施import时,当前目录是不会变的(就到底试行子目录的文件),照旧需求完整的包名。

from mypackage.subpackage_1 import test11

  综上,大家得以在__init__.py 内定暗许要求导入的模块  

2.3  偷懒的导入方法

  有时候大家在做导入时会偷懒,将包中的全体剧情导入

from mypackage import *

  那是怎么落到实处的吧? __all__ 变量正是干这么些工作的。

  __all__ 关联了多个模块列表,当推行 from xx import * 时,就能够导入列表中的模块。我们将 __init__.py 修改为 。

__all__ = ['subpackage_1', 'subpackage_2']

  这里未有包含 subpackage_3,是为了申明 __all__ 起效果了,并不是导入了全数子目录。

>>> from mypackage import *
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'subpackage_1', 'subpackage_2']
>>> 
>>> dir(subpackage_1)
['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

  子目录的中的模块未有导入!!!

  该例子中的导入等价于

from mypackage import subpackage_1, subpackage_2

  因而,导入操作会继续寻找 subpackage_1 和 subpackage_2 中的 __init__.py 并进行。(不过此时不会进行 import *

  我们在 subpackage_1 下添加 __init__.py 文件:

__all__ = ['test11', 'test12']

# 默认只导入test11
from mypackage.subpackage_1 import test11

  再来导入试试

>>> from mypackage import *
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'subpackage_1', 'subpackage_2']
>>> 
>>> dir(subpackage_1)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'test11']

  要是想要导入子包的富有模块,则须求更标准钦赐。

>>> from mypackage.subpackage_1 import *
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'test11', 'test12']

3. 布署模块的起先化操作

  在领悟了 __init__.py 的做事原理后,应该能理解该文件正是一个例行的python代码文件。

  由此得以将开始化代码放入该文件中。

  

 

 

  

 

  

本文由澳门至尊网站发布于免费资源,转载请注明出处:Python小说: __init__.py的功能

关键词: