当前位置:   article > 正文

__init__在python中的用法_python 中的__init__.py的用法与个人理解

__init__在python中的用法_python 中的__init__.py的用法与个人理解

使用Python模块常见的情况是,事先写好A.py文件,需要import B.py文件时,先拷贝到当前目录,然后再import

这样的做法在程序量较小的情况下是可行的,如果程序交互复杂程度稍高,就很费力了

有一种解决方法可以将多个.py文件组织起来,方便在外部统一调用,和在内部互相调用:python中的 __ init__.py在包调用中起到了重要的作用

首先要明确的Python在执行import包的时候,执行的操作,按照python的文档描述,操作如下:

a) 创建一个新的,空的module对象(它可能包含多个module);

b) 把这个module对象插入sys.module中

c) 装载module的代码(如果需要,首先必须编译) (首先需要找到module程序所在的位置,其原理为:如果需要导入的module的名字是m1,则解释器必须找到m1.py,它首先在当前目录查找,然后是在环境变量PYTHONPATH中查找)

d) 执行新的module中对应的代码。

Python中的package定义很简单,其层次结构与.py所在目录的层次结构相同,比较关键的一点是package中必须包含一个init.py的文件

例如,我们可以这样组织一个package: init为顶层目录

在这里插入图片描述

运行结果如下

在这里插入图片描述

其中init.py可以为空,只要它存在,解释器对其视作一个package处理。

第一层:pack, pack2, main.py

第二层:

pack: __ init__.py,module_A.py

pack2:__ init__.py,module_B.py

main.py 调用脚本:

'''

遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

'''

from pack import func1

from pack import func2

from pack2 import print_lst

def main():

func1()

func2()

print_lst()

if __name__ == "__main__":

main()

其中 module_A:

'''

遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

'''

def func1():

print("MODULEAAAAA_func1111")

def func2():

print("MODULEAAAAA_func2222")

同一层 __init __.py

from .module_A import func1

from .module_A import func2

.module_A 表示__ init__.py同一层目录的module_A

个人理解是:当 main.py调用脚本from pack import func1

由于from操作 会默认目录下存在pack包,解释器会首先寻找init.py

而init.py内容不为空,对module_A引入了两个函数fun1,fun2,生成了函数引用域(太菜不知道专属名词)

所以在main.py 中可以不显式地指明module_A而直接用: from pack import fun1,fun2

如果把pack下的init.py 的第二行 import func2注释

在这里插入图片描述

也就是说,package内的module的import 是受__ init__.py限制的

有时在import语句中会出现通配符*,导入某个module中的所有元素,这是怎么实现的呢?

答案就在init.py中。如果在init.py文件中写(指定)

__all__ = ['module_A']

如果改为

__all__ = []

Traceback (most recent call last):

File "", line 1, in

ImportError: No module named module_A

运行则会报错,如上

这也就是说,package内的module的导入是受init.py限制的

好了,最后来看看,如何在package内部互相调用。

如果希望调用同一个package中的module,则直接import即可。

也就是说,在module_A.py中,可以直接使用import module_others

如果不在同一个package中,例如我们希望在module_A.py中调用module_B.py中的FuncB,则应该这样:

from module_B的包名(目录).module_B import funcB

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/964244
推荐阅读
相关标签
  

闽ICP备14008679号