模块的优点:
1、便于维护
2、将一个任务分解成为多个模块,便于实现团队协同开发,完成大规模程序
3、实现代码复用,一个模块完成后可以被反复调用
模块化编程的一般流程:
1、设计API,进行功能描述(不涉及代码,模块的作用,模块中涉及哪些类,类的作用,定义哪些函数,函数的作用,一般用文档字符串)
可以通过 模块.__doc__来获得文档字符串的内容
2、编码实现API中描述的内容
3、在模块中编写测试代码,并消除全局代码
4、使用私有函数实现不被外部客户端调用的函数模块
模块的创建和测试代码:
每一个模块都有一个名称,通过特殊变量__name__可以获取模块的名称。在正常情况下。,模块名字对应源文件名,仅有一个例外,就是当模块作为程序入口时(主程序,交互式提示符下)(在源代码内),他的__name__的值__main__。我们可以根据这个特性。将模块源代码文件中的测试代码进行独立的处理。(别的地方导入此模块名叫源文件名,在源代码内自己访问就叫__main__)
import导入的是模块
运用具体方法时不加模块名无法识别,使用时格式是 模块名.方法()
from…import 导入的是模块中的成员,函数或类
使用时可以直接识别,不需要添加模块名,就可以直接引用其中的函数/类
导入的本质是调用一个内置函数__import__()函数
动态导入时可以使用importlib模块
import importlib
a = importlib.import_module('math')#动态导入模块
print(a.pi)
b = importlib.reload('math')#重新加载该模块
包:
当一个项目中有很多模块时,我们把功能类似的模块放到一起,形成了包。包中必须含有__init__.py的文件夹。
包下面可以包含模块,也可以包含子包
导入包操作:
#import a.aa.modul_AA
#使用时必须加完整的名称来引用
#a.aa.module_AA.fun__AA()
#from a.aa import modul_AA
#可以直接使用模块名
#module_AA.fun__AA()
#from a.aa.modul_AA import fun_AA
#可以直接使用模块内函数名
#fun_AA()
from package import item 这种语法中,item可以是包,模块,也可以是函数、类、变量
import item1,item2 这种语法中item只能是包或者模块,不能是其他的
导入包的本质就是‘导入了包的__init__.py’文件(这个文件里可以写这个包需要统一执行的代码,一般只用作导入,不复杂化),也就是说,import package1意味着执行了包package1下面的__init__.py文件,这样,可以在__init__.py文件中批量导入我们需要的模块,,而不是一个一个导入
init.py的三个核心作用:
- 作为包的标识,不能删除。
- 用来实现模糊导入
- 导入包实质是执行__init__.py 文件,可以在__init__.py 文件中做这个包的初始化、以及
需要统一执行代码、批量导入。
包内引用:
如果是子包内的引用,可以按相对位置引入子模块 以 aa包下的module_AA中导入a 包下内容为例:
from … import module_A #…表示上级目录 .表示同级目录
from . import module_A2 #.表示同级目录
当我们导入某个模块文件时, Python 解释器去哪里找这个文件呢?只有找到这个文 件才能读取、装载运行该模块文件。它一般按照如下路径寻找模块文件(按照顺序寻找,找 到即停不继续往下寻找):
- 内置模块
- 当前目录
- 程序的主目录
- pythonpath目录(如果已经设置了 pythonpath环境变量)
- 标准链接库目录
- 第三方库目录(site-packages 目录)
- .pth文件的内容(如果存在的话)
- sys.path.append()临时添加的目录