你常常看到的 __init__.py 到底是个啥?

作者|小帅b

来源|学习python的正确姿势

当你去看一些 Python 相关的项目时,常常会看到 __init__.py,当你使用某些编辑器创建 Python Package 的时候,它也会自动给你生成一个 __init__.py 文件。

这玩意有什么用呢?

我们知道, Python 中的包是可以包含多个 py 模块的,我们可以在不同的地方通过包名区分使用这些模块。

话不多说,咱们先来创建一下这样的目录:

我们在这里面创建了三个 Python 子包,里面都有 __init__ 和 module 的 py 文件。

我们分别在不同包下的 __init__ 中写一个 print 语句:

接着我们进入 Python ,分别来导入这些模块:

可以看到,当我们导入父模块中的子模块的时候,它会优先执行父模块中的 init ,接着会执行指定模块中的 init。

当然,只是导入父模块的时候只会执行父模块中的 init:

也就是说,当我们去 import 一个 Package 的时候,它会隐性的去执行 __init__.py , 而在 __init__.py 中定义的对象,会被绑定到当前的命名空间里面来。

比如有时候我们会这样去导入一个包下的所有模块,会这样操作:

但这个时候你会发现并没有将相关的子模块导入进来:

这时候你可能想到了,可以在父模块中的 __init__.py 做文章,先把它们导入进来不就行了:

这里的 __all__ 相当于导入 [] 里面定义的模块。

这次再导入:

可以看到,所有子模块就都一并导入进来了。

当然,你也可以在 __init__.py 做一些初始化的操作,比如数据库 session 的创建:

其实在 Python3.2 版本之前,定义的 Package 下面一定要有 __init__.py 文件,这样 Python 才知道它是一个 Package,才可以寻找到相关模块的路径从而被 import。

而在 Python3.2 之后的版本就不需要再额外的去专门创建一个 __init__.py 来告诉 Python 它是一个 Package 了,因为现在创建的包叫 Namespace package, Python 可以自动搜寻 Package 路径,哪怕你的父包路径发生了改变,你在下次导入的时候, Python 还是会自动重新搜索包路径。

我们把刚刚定义的 __init__ 都给删掉试试:

接着我们在 Python3.8 版本导入看看:

可以看到,尽管我们在 package 中没有定义 __init__.py,依然可以导入使用。

以同样的形式,我们在 Python2 中导入看看:

可以看到,它被整懵逼了...

综上,__init__.py 会在 import 的时候被执行,而空的 __init__.py 在 Python 新版本中已经不需要你额外去定义了,因为就算你不定义 init, Python 也知道你导入的包路径,但是如果你想要做一些初始化操作,或者像我们刚刚说的预先导入相关的模块,那么定义 __init__.py 还是很有必要的哟。

希望对你有帮助,那么我们下回见,peace!



一起学Java




一起学Python

------------------


如果觉得文章有点用的话,请毫不留情地素质三连吧,分享、点赞、在看、收藏,我不挑,因为这将是我写作更多优质文章的最强动力。
往期精选(????猛戳可查看)
1、Python爬取美团数据,分析一波

2、全平台都能用的pandas运算加速神器
3、整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了





点我,了解Python训练营!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值