python引入包模块

包:实在文件夹的基础上另外多包含了一个叫__init__.py的文件,它是几个模块的集合

假设我们实例的模块或者说文件目录结构如图,模块目录下除__init__.py文件外的其他py文件中都包含一个echo方法,打印自己的方法名。

如果我们要导入one01.py这个模块,name我们有以下三种写法:

方法一:

1
2
import my_moudles.one.one01
my_moudles.one.one01.echo()

这样写导入包模块太长,我们可以简化用别名调用

1
2
import my_moudles.one.one01 as one01
one01.echo()

方法二:

1
2
from my_moudles.one import one01
one01.echo()

方法三:

1
2
from my_moudles.one.one01 import echo
echo()

下面说下只导入包,去使用包下面的模块。我们知道,包下面有很多模块,我们如果要调用所有其下的模块不可能一一写出来,这样太麻烦了。其实一开始我们注意到每个包中都包含一个叫__init__.py文件,我们直接调用包会发现,直接执行了其下的__init__.py文件由此我们想到是否可以在这个init文件上做文章。通过引入包的测试我们能得到以下结论:

# 直接导入包 ,需要通过设计init文件,来完成导入包之后的操作

# 导入一个包

​ # 不意味着这个包下面的所有内容都是可以被使用的

​ # 导入一个包到底发生什么了?

​ # 相当于执行了这个包下面的__init__.py文件

导入包类似路径引入路径,可分为绝对导入相对导入

绝对导入:

# 在执行一个py脚本的时候,这个脚本以及和这个脚本同级的模块中只能用绝对导入

# 缺点

# 所有的导入都要从一个根目录下往后解释文件夹之间的关系

# 如果当前导入包的文件和被导入的包的位置关系发生了变化,那么所有的init文件都要做相应的调整

这里我们使用绝对导入来使用包下的模块—–

首先修改my_modules下的init文件如下

1
from my_moudles import one,two,three

这样等于又引入了三个模块包,其次呢我们依次需要在one、two、three中修改其下的init文件

1
2
3
from my_moudles.one import one01,one02
from my_moudles.two import two 01,two 02
from my_moudles.three import three01,three02

这样我们就可以使用my_modules下的所有模块了

1
2
3
4
5
6
7
my_moudles
my_moudles.one.one01.echo()
my_moudles.one.one02.echo()
my_moudles.two.two01.echo()
my_moudles.two.two02.echo()
my_moudles.three.three01.echo()
my_moudles.three.three02.echo()

相对导入:

# 不需要去反复的修改路径

# 只要一个包中的所有文件夹和文件的相对位置不发生改变

# 也不需要去关心当前这个包和被执行的文件之间的层级关系

# 缺点

# 含有相对导入的py文件不能被直接执行

# 必须放在包中被导入的调用才能正常的使用

这里我们使用相对导入来使用包下的模块—–

.跟我们路径中使用方式一样,.代表当前目录;..代表当前目录的上一层

首先修改my_modules下的init文件如下

1
from . import one,two,three

这样等于又引入了三个模块包,其次呢我们依次需要在one、two、three中修改其下的init文件

1
2
3
from . import one01,one02
from . import two 01,two 02
from . import three01,three02

这样我们就可以使用my_modules下的所有模块了

1
2
3
4
5
6
7
my_moudles
my_moudles.one.one01.echo()
my_moudles.one.one02.echo()
my_moudles.two.two01.echo()
my_moudles.two.two02.echo()
my_moudles.three.three01.echo()
my_moudles.three.three02.echo()