模块
- Python 程序由模块组成。一个模块对应 python 源文件,一般后缀名是:
.py
- 模块由语句组成。运行 Python 程序时,按照模块中语句的顺序依次执行
- 语句是 Python 程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等
相关信息
“量变引起质变”是哲学中一个重要的理论。量变为什么会引起质变呢?本质上理解,随着数量的增加,管理方式会发生本质的变化;旧的管理方式完全不适合,必须采用新的管理方式。
- 程序越来越复杂,语句多了,怎么管理?很自然的,我们会将实现同一个功能的语句封装到函数中,统一管理和调用,于是函数诞生了。
- 程序更加复杂,函数和变量多了,怎么管理?同样的思路,“物以类聚”,我们将同一类型对象的“数据和行为”,也就是“变量和函数”,放到一起统一管理和调用,于是“类和对象”诞生了。
- 程序继续复杂,函数和类更加多了,怎么办?好,我们将实现类似功能的函数和类统统放到一个模块中,于是“模块”诞生了。
- 程序还要复杂,模块多了,怎么办? 于是,我们将实现类似功能的模块放到一起,于是“包”就诞生了。
❤️ 大家可以清晰的看到这发展的流程,核心的哲学思想就是“量变引起质变”、“物以类聚”。同样的思路,在企业管理、人的管理中思路完全一致。大家可以举一反三。
为什么需要模块化编程
模块(module)对应于 Python 源代码文件(.py 文件)。模块中可以定义变量、函数、类、普通语句。 这样,我们可以将一个 Python 程序分解成多个模块,便于后期的重复应用。
模块化编程(Modular Programming)将一个任务分解成多个模块。每个模块就像一个积木一样,便于后期的反复使用、反复搭建。
模块化编程有如下几个重要优势:
- 便于将一个任务分解成多个模块,实现团队协同开发,完成大规模程序
- 实现代码复用。一个模块实现后,可以被反复调用
- 可维护性增强
模块化编程的流程
模块化编程的一般流程:
- 设计 API,进行功能描述。
- 编码实现 API 中描述的功能。
- 在模块中编写测试代码,并消除全局代码。
- 使用私有函数实现不被外部客户端调用的模块函数。
API(Application Programming Interface 应用程序编程接口)是用于描述模块中提供的函数和类的功能描述和使用方式描述。
模块化编程中,首先设计的就是模块的 API(即要实现的功能描述),然后开始编码实现 API 中描述的功能。最后,在其他模块中导入本模块进行调用。
可以通过 help(模块名)查看模块的 API。一般使用时先导入模块 然后通过 help 函数查看。
import math
help(math)
设计计算薪水模块的 API
# encoding=utf-8
"""
本模块用于计算公司员工的薪资
"""
company = "嘉美社区"
def yearSalary(monthSalary):
"""根据传入的月薪,计算出年薪"""
pass
def daySalary(monthSalary):
"""根据传入的月薪,计算出每天的薪资"""
pass
如上模块只有功能描述和规范,需要编码人员按照要求实现编码。
我们可以通过__doc__
可以获得模块的文档字符串的内容。源代码如下:
#encoding=utf-8
import salary
print(salary.__doc__) # 本模块用于计算公司员工的薪资
print(salary.yearSalary.__doc__) # 根据传入的月薪,计算出年薪
模块导入
模块化设计的好处之一就是“代码复用性高”。写好的模块可以被反复调用,重复使用。模块的导入就是“在本模块中使用其他模块”。
import 语句导入
import
语句的基本语法格式如下:
import 模块名 #导入一个模块
import 模块1,模块2… #导入多个模块
import 模块名 as 模块别名 #导入模块并使用新名字
`import`加载的模块分为四种类型
使用 python
编写的代码.py
文件已被编译为共享库或 DLL 的 C 或 C++扩展
一组模块的包
使用 C 编写并链接到 python 解释器的内置模块
import math as m
print(m.sqrt(4)) #开方运算
from…import 导入
Python 中可以使用 from…import 导入模块中的成员。基本语法格式如下:from 模块名 import 成员1,成员2,…
如果希望导入一个模块中的所有成员,则可以采用如下方式:from 模块名 import *
警告
⚠️ 尽量避免 from 模块名 import *
这种写法。它表示导入模块中所有的不是以下划线_开头的名字都导入到当前位置。 但你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差。一般生产环境中尽量避免使用,学习时没有关系。
from math import sqrt
print(sqrt(4)) #开方运算
- 我们自定义一个模块
calculator.py
"""一个实现四则运算的计算器"""
def add(a, b):
return a + b
def minus(a, b):
return a - b
class MyNum:
def print123(self):
print(123)
- 我们在另一个模块
test.py
测试
import calculator
a = calculator.add(30,40)
# add(100,200) #不加模块名无法识别
print(a)
# from calculator import *
from calculator import add
a = add(100,200) #无需模块名,可以直接引用里面的函数/类
print(a)