Python__init__.py作用

码道人 2021-10-27 03:35:15
Python 作用 py init python__init__.py

_init_.py作用:

该文件的作用就是相当于把自身整个文件夹当作一个来管理,每当有外部import的时候,就会自动执行里面的函数。

1. 标识该目录是一个模块包(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']

这里没有包含 subpackage3,是为了证明 _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 subpackage1, subpackage2 因此,导入操作会继续查找 subpackage1 和 subpackage2 中的 _init.py 并执行。(但是此时不会执行 import *) 我们在 subpackage1 下添加 _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代码文件。 因此我们可以将初始化代码放入该文件中。

版权声明
本文为[码道人]所创,转载请带上原文链接,感谢
https://markdowner.net/v1/article/by_user/240921302595727360

  1. python求带我脱离苦海,哎_
  2. Python 数据分析里面轴的问题
  3. python初学者,请问使用openpyxl库读取文件后出现图片中的报错要怎么解决?
  4. 大学毕业论文写有关python
  5. 授人以鱼吧友友python编写程序自动计算个人总分平均分各科最高最低平均分
  6. python怎么将四行代码换成一行啊
  7. 用Python如何编写啊 真不会啊?
  8. 这个布尔变化怎么做啊(Python
  9. PYTHON求集合交集需要用户手动输入集合名
  10. Python运行哈姆雷特词频统计时出错(如图),是哪方面的问题?
  11. 【Python表白代码合集】”我还是很喜欢你,像风走了八千里,不问归期”!!
  12. python实现学生信息管理系统(含代码)
  13. wxpython中如何按键停止死循环?
  14. python 类的问题?不懂这种方法的作用?不是继承那是什么作用?
  15. Python 题目不会写 求帮助!
  16. Python,turtle制图,要求使用for,while编写
  17. Python题目不会 求帮助! 谢谢您!
  18. Python题目不会!求帮助!
  19. Python这个看不太懂,,大神们帮个忙
  20. 安装拓展库pandas失败怎么解决
  21. python将字符串转成特定列表格式
  22. Python做一个保护手机号编程
  23. 用Spyder运行Python爬虫时仅输出“runfile(xx), wdir=xx”
  24. 使用Python对一组数据进行分段拟合,如何处理断点处的左右倒数相等
  25. Python输出符合条件的文件的路径名
  26. Python中pandas怎么实现分组去重统计和求和
  27. python xpath 爬虫,请帮帮我吧!
  28. python 用泰勒公式近似计算sinx的值 求解代码中哪里出现了错误
  29. Python语法2
  30. python如何将输出的各行数字对齐
  31. 使用 Python 进行数据可视化之Matplotlib
  32. python新鲜题 老公们 救救孩子
  33. 如何用python解答 要如何着手
  34. 请问Python正则表达式如何在多个文本中匹配出关键字
  35. Python 三天打鱼两天晒网问题
  36. mac安装python3
  37. 請問python要怎麼印数字倒等腰三角形
  38. 【算法学习】807. 保持城市天际线(java / c / c++ / python / go / rust)
  39. 【算法学习】237. 删除链表中的节点(java / c / c++ / python / go)
  40. 【算法学习】1512. 好数对的数目(java / c / c++ / python / go / rust)
  41. 【算法学习】1672. 最富有客户的资产总量(java / c / c++ / python / go / rust)
  42. 【算法学习】771. 宝石与石头(java / c / c++ / python / go / rust)
  43. 【算法学习】02.03. 删除中间节点(java / c / c++ / python / go)
  44. 【算法学习】1769. 移动所有球到每个盒子所需的最小操作数(java / c / c++ / python / go / rust)
  45. 【算法学习】1486. 数组异或操作(java / c / c++ / python / go / rust)
  46. 【算法学习】剑指 Offer 64. 求1+2+…+n(java / c / c++ / python / go / rust)
  47. 【算法学习】LCP 44. 开幕式焰火(java / c / c++ / python / go / rust)
  48. 【算法学习】剑指 Offer 58 - II. 左旋转字符串(java / c / c++ / python / go / rust)
  49. python的学校疑问难题求解
  50. 大学python题 作业题 基础题
  51. Python字典的知识,输出的样例为,最高分:89
  52. python写入文件失败且程序提前中止
  53. 用Python写一个学生字典,帮帮忙
  54. Python,能不能帮帮忙,真的不会
  55. [python] yield 和 readline() 的使用问题
  56. python安装找不到问题救救孩子
  57. python中循环结构完成数字游戏
  58. 如何用python实现多列vlookup(excle操作)
  59. python语言deLong‘s test:通过统计学的角度来比较两个ROC曲线、检验两个ROC曲线的差异是否具有统计显著性
  60. 安装LPC55S69 MicroPython模块是遇到的CDC Interface驱动问题