9. 模块与包

Pyhton 语言的强大得益于各种各样的扩展库,来自全球的开发者为 Python 贡献了大量的扩展库,这些扩展库极大地丰富了 Python 的功能,本章将会介绍如何开发出自己的扩展程序。

9.1. 模块

在实际的开发过程中,对于较大的项目来说,一般不会在一个源文件中编写整个项目的源代码,通常需要按照功能或者其他的一些设计上的考虑,对源代码进行拆分,拆分成多个 Python 文件,每一个 Python 文件就是一个模块。

9.1.1. 开发一个模块

如上, Python 中的模块就是 Python 程序。以一个简易计算器为例,新建一个 calculate.py 的 Python 文件,具体代码如下所示:

# 加法
def add(a, b):
	return a+b
# 减法
def sub(a, b):
	return a-b
# 乘法
def mul(a, b):
	return a*b  
# 除法
def div(a, b):
	try:
		return a/b
	except ZeroDivisionError as e:
		print(e) 
# 取余
def mod(a, b):
	try:
		return a%b
	except ZeroDivisionError as e:
		print(e)

上述的 calculate.py 的 Python 文件就是一个 Python 模块,文件名就是它的模块名,其模块名为 calculate

9.1.2. 模块的导入

要想在另一个 Python 文件中使用定义好的 calculate 模块,需要使用 import 关键字导入模块, import 语句的语法主要有如下的两种:

import module_name [as alias]
from module_name import member_name [as alias]

其中,第一种方法是导入模块内的所有成员,第二种方法只是导入模块内的指定成员。

使用第一种方法导入模块时,在使用时需要添加模块名作为前缀,即: module_name.member_name

新建一个新的 Python 文件,命名为 module_test.py ,其代码如下:

# 第一种导入方式,以加法为例
import calculate

c = calculate.add(2, 3)
print(c) # 5

# 第二种导入方式,以减法为例
from calculate import sub

d = sub(3, 2)
print(d) # 1

9.2. 包

对于一个需要实际应用的模块而言,往往会具有很多程序单元,包括变量、函数和类等,如果将整个模块的所有内容都定义在同一个 Python 源文件中,这个文件将会变得非常庞大,此时就引入了包的概念。包其实就是包含多个模块源文件的文件夹,与普通文件夹不一样的是,在包种必须包含一个 __init__.py 文件。

9.2.1. 定义包

定义包主要有两步:

  • 创建一个文件夹,该文件夹的名字就是该包的包名
  • 在该文件夹内添加一个 __init__.py 文件

还是以上述的简易计算器程序为例,与上面不同的是将上述的 calculate 模块中的 5 个成员函数分别建立一个模块,分别命名为: addsubmuldivmod 。将这 5 个模块放入到一个名为 cal_package 的包中,并建立一个 __init__.py 的文件,如下图所示:

输入图片说明

9.2.2. 导入包内成员

如果需要使用上述 5 个模块中的函数,则可以使用 import 语句导入包内的成员,具体语法与模块的导入一致,具体使用方法如下代码所示:

# 第一种导入方式,以加法为例
import cal_package.add as add
a = add.add(2, 3)
print(a) # 5

# 第二种导入方式
from cal_package.add import add
b = add(2, 3) # 5
print(b)

9.3. 本章小结

本章介绍了 Python 中的模块和包,模块既是使用 Python 进行模块化编程的重要方式,也是扩展 Python 功能的重要手段。大量第三方模块和库极大地扩展了 Python 的能力,形成了 Python 强大的生态圈。

本章需要掌握知识点:

  1. 模块的两种导入方式及其区别
  2. 区分包和模块的区别