python 模块和包

python module and package

Posted by Randle on July 29, 2019

模块(module)

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。比如:

1
2
3
# func_add.py
def add(a,b):
    return a+b

包(package)

包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。

简单来说,包就是文件夹,但该文件夹下必须存在 init.py 文件, 该文件的内容可以为空。init.py 用于标识当前文件夹是一个包。

考虑如下 compute 的包结构,test.py 为测试调用包的代码:

1
2
3
4
5
6
7
test.py
compute
|---__init__.py
|---addFunc.py
|---subFunc.py
|---multiFunc.py
|---divFunc.py

init

__init__.py,可以作为包的初始化例程执行, 也可以当做主程序运行, 如下所示:

1
2
3
4
5
6
7
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
if __name__ == '__main__':
    print '作为主程序运行'
else:
    print 'compute 初始化'

测试:

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 导入 Phone 包
from compute.addFunc import myadd
from compute.subFunc import mysub
 
myadd(1,2)
mysub(4,3)

结论:

1
2
3
compute 初始化
I'm in myadd
I'm in mysub

第一次导入包的时候, 初始化例程被执行。

all

__all__变量是一个列表,可以在模块中和__init__.py中使用。 __all__变量结合from ... import *语句使用,__all__变量就是控制*所表示要引入的东西(模块,函数,类等)。

模块中使用__all__

如果在模块中使用__all__变量,如下所示:

1
2
3
4
5
6
7
__all__ = ['add1']     #只导入add1,而不会导入add2
 
def add1(*variaties):
    sum = 0
    for i in variaties:
        sum += i
    return sum

在导入该模块下的所有函数时,只会导入列表中声明的函数:

1
2
from compute.addFunc import *
print(add1(1,1))

使用其他函数会报错。

init 中使用 all

如果在__init__.py模块中设置__all__变量,则列表内容规定了import *所导入的模块。我们在compute下的__init__.py模块中添加__all__变量,如下所示:

1
__all__ = ['addFunc','divFunc','mulFunc'] #列表中填写被引入模块的名称

然后在import * 时,只引入被声明的模块。

1
2
3
4
5
from compute import *
print(divFunc.div(2,3))
print(addFunc.add1(1,2))
print(addFunc.add2(1,2))
print(mulFunc.mul(2,3))

而没有被声明的subFunc.py模块则不能使用。


参考资料