你常常看到的 __init__.py 到底是个啥? 2024-04-07 15:20:48 当你去看一些 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!点击留言扫一扫学习 Python 没烦恼相关 你常常在写的 if __name__ == '__main__' 到底是个啥? 赞 (0) 相关推荐 python之路—模块和包 阅读目录 一 模块 3.1 import 3.2 from ... import... 3.3 把模块当做脚本执行 3.4 模块搜索路径 3.5 编译python文件 二 包 2.2 import 2 ... Python杂谈: __init__.py的作用 https://www.cnblogs.com/tp1226/p/8453854.html 我们经常在python的模块目录中会看到 "__init__.py" 这个文件,那么它 ... python运行过程解析 https://m.toutiao.com/is/JtXTSjN/ 使用python一段时间,如果问下面这些问题你能明确回答吗? 包与模块是什么? __init__.py.__main__.py是做什 ... python 包机制、导入模块 表白:黑白圣堂血天使,天剑鬼刀阿修罗. 讲解对象:/python 包机制.导入模块 作者:融水公子 rsgz Python3 教程 python教程 http://www.rsgz.top/post ... Python创建包,导入包(入门必读) <Python包>一节中已经提到,包其实就是文件夹,更确切的说,是一个包含"__init__.py"文件的文件夹.因此,如果我们想手动创建一个包,只需进行以下 2 步操 ... Python模块之间的相互引用问题 在某次运行过程中出现了如下两个报错: 报错1: ModuleNotFoundError: No module named '__main__.src_test1'; '__main__' is not ... 成功解决bs4\__init__.py:181: UserWarning: No parser was explicitly specified, so I'm using the best avai 解决问题 bs4\__init__.py:181: UserWarning: No parser was explicitly specified, so I'm using the best ava ... 成功解决\h5py\__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float 成功解决\h5py\__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float ... 成功解决 bs4\__init__.py:219: UserWarning: "b'.'" looks like a filename, not markup. You should probably 成功解决 bs4\__init__.py:219: UserWarning: "b'.'" looks like a filename, not markup. You shoul ... #PY小贴士# py2 和 py3 的差别到底有多大? 昨天的文章里也提到了:python 2 版本将在今年正式停止官方维护.(具体时间上有不同说法,1月1号.4月.8月--但这个差别意义不大了) 从我开始做 Python 编程教学的工作开始,就始终在解答 ... 成功解决 \tensorflow\…\datasets\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.lea 成功解决 \tensorflow\-\datasets\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.lea ... 到底是为什么练习瑜伽?走了那么多弯路才搞清楚.... 为什么练习瑜伽? 其实,每个人练习瑜伽都会有目的,只不过有的人的目的比较明确,有的不是很明确而已:大多数人的通常的目的都是健身,比如让身体更健康,愈疗身体的疾病,或者是增加身体的力量,柔软性和活力.但 ... 装修到底选半包还是全包?看完这篇详细解答,完美避坑! 稍微了解过装修的朋友肯定都听过"半包"和"全包"这两个词,但是对装修新手来说却是一个很大的疑问,这两者之间到底有什么区别?自家装修到底选哪种比较好?今天我们就来 ... 古人为何将13岁的少女,称为“豆蔻年华”,豆蔻到底代表着什么? "头上金钗十二行,足下丝履五文章",这是南朝梁武帝萧衍在<河中之水歌>中描写女主人公"莫愁"的诗句.诗中的莫愁,是一位美丽精致的女孩.在那个年代,女 ...