使用python经常会导入外部包,所以自己写一个深层包结构,然后自己调用,会理解的比较深刻
首先创建如下图所示的包结构:共有3层文件夹,最里面的一层文件夹下面包含4个有关加减乘除的模块,分别提供了+-*/的运算方法。
注意:每一层新建的时候要建Python Package,而不是Directory。
一,import
import语句在深层包结构中的用法如下:
import myModule.simpleCompute.compute.addFunc
print(myModule.simpleCompute.compute.addFunc.add1(1,2))
看起来使用比较麻烦,首先从顶层目录一直向下导入到指定模块。调用时仍然需要从顶层一直到模块中的具体方法
二,from ... import ...
对比import,这种方法导入包后,再调用时就不需要使用包的全名啦。而且可以有不同的导入形式
1,直接从模块导入所需的方法
from myModule.simpleCompute.compute.addFunc import add1
print(add1(1,2))
2,先导入指定模块,再调用具体方法
from myModule.simpleCompute.compute import addFunc
print(addFunc.add1(2,3))
三,__init__.py模块
上面的结构中,每一层下面都有一个名为__init__.py的模块,该模块可以为空,用于标识python包
四,__all__变量
__all__变量是一个列表,可以在模块中和__init__.py中使用。
__all__变量结合from ... import * 语句使用,__all__变量就是控制*所表示要引入的东西(模块,函数,类等)
1,如果在模块中使用该变量,下面是addFunc.py的代码:
__all__ = ['add1'] #只导入add1,而不会导入add2
def add1(*variaties):
sum = 0
for i in variaties:
sum += i
return sum
def add2(*variaties):
sum = 0
for i in variaties:
sum += i
return sum
if __name__ == '__main__':
print(add1(1,2,3,4,5))
那么,在导入该模块下的所有函数时,只会导入列表中声明的函数
from myModule.simpleCompute.compute.addFunc import *
print(add1(1,1))
而此时,调用add2()就会报错
2,如果在__init__.py模块中设置__all__变量,则列表内容规定了import * 所导入的模块
我们在compute下的__init__.py模块中添加__all__变量,如下所示:
__all__ = ['addFunc','divFunc','mulFunc'] #列表中填写被引入模块的名称,没有.py
然后在import * 时,只引入被声明的模块
from myModule.simpleCompute.compute import *
print(divFunc.div(2,3))
print(addFunc.add1(1,2))
print(addFunc.add2(1,2))
print(mulFunc.mul(2,3))
而没有被声明的subFunc.py模块则不能使用