__init__.py的作用--转载

__init.py__的作用是简化导入语句。

1 没有__init__.py时导入函数
我们先来看看没有__init.py__时是怎么导入模块和函数的。假设我的目录结构如下:

.  # main.py所在目录
|- main.py

|- my_module1.py
  |- my_function1()  # my_module.py中的一个函数

|- my_package  # my_package是一个文件夹
  |- my_module2.py
    |- my_function2()

想要在main.py中调用my_function1()和my_function2(),可以输入下面语句进行导入:

import my_module1
from my_package import my_module2

### 调用my_function1()和my_function2()
my_module1.my_function1()
my_module2.my_function2()
1
2
3
4
5
6

from my_module1 import my_function1
from my_package.my_module2 import my_function2

my_function1()
my_function2()
1
2
3
4
5
可以看到,没有__init.py__时,导入其他模块的函数,需要一层层地去找,所以导入语句长度也与文件夹层数成正比。

2 有__init__.py时导入函数
为了调用my_function2(),需要从my_module2中导入,而my_module2又在my_package文件夹中,于是就有了上面的导入语句:

from my_package.my_module2 import my_function2
1
假如my_package中my_function2,那我们就不用逐层深入地去找了,就可以用下面的语句导入了:

from my_package import my_function2
1
而__init__.py就能实现这个功能。
当我们导入my_package时,python会先看下这个文件夹下有没有__init__.py这个文件,如果有,就先执行这个文件,相当于初始化my_package,跟类(Class)首个方法__init__()作用差不多,都是初始化。于是乎,我们可以在刚导入my_package这个模块时,初始化加载my_function2到my_package中,在main.py里,我们就能用上面的语句导入my_function2了。
__init__.py的内容可以这样编写:

from .my_module2 import my_function2
1
现在,我们my_package文件夹里多了个__init__.py,目录结构如下:
.  # main.py所在目录
|- main.py

|- my_module1.py
  |- my_function1()  # my_module.py中的一个函数

|- my_package  # my_package是一个文件夹
  |- __init__.py  # 内容如上
  |- my_module2.py
    |- my_function2()
我们可以测试一下,把main.py的内容改成下面这样:

import my_package

print(dir(my_package))
1
2
3
在打印的内容里,我们看到了’my_function2’,说明my_function2已经加载到my_package里了,这样,我们在main.py里就可以直接从my_package导入my_function2了,如下:

from my_package import my_function2
1
3 __init__.py中的点(.)
我刚看__init__.py内容就觉得很奇怪,为什么my_module2前面要加个点(.)呢,不加点会怎样呢?
不加点的话,会报错:没有my_module2这个模块。
那是因为,我们运行的是main.py,当前工作目录就在main.py所在的目录,不加点的话,__init__.py就会从当前工作目录中找模块my_module2,这当然找不到,因为my_module2在my_package文件夹下。所以__init__.py的导入一般都会带上点(.),表示从__init__.py的目录下导入模块。想要亲身实践的同学,可以在__init__.py中加入:

import os

print(os.getcwd())
1
2
3
这就是我对__init__.py的一点粗浅的理解,不过对我来说目前了解到这程度也够了,希望能帮助到有同样疑问的人。
————————————————
版权声明:本文为CSDN博主「cgyx008」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cgyx008/article/details/99710504

posted @ 2020-02-24 09:32  乖乖楠  阅读(311)  评论(0编辑  收藏  举报