模块
模块化编程的流程
模块化编程的一般流程:
1. 设计 API,进行功能描述。
2. 编码实现 API 中描述的功能。
3. 在模块中编写测试代码,并消除全局代码。
4. 使用私有函数实现不被外部客户端调用的模块函数。
help()查看 math 模块的 API
每个模块都有一个名称,通过特殊变量__name__可以获取模块的名称。
仅有一个例外,就是当一个模块被作为程序入口时(主 程序、交互式提示符下),它的__name__的值为“__main__”。(就是自己调用自己)
通过 __doc__可以获得文档字符串的内容。
import 语句导入
import 语句的基本语法格式如下:
import 模块名 #导入一个模块
import 模块 1,模块 2… #导入多个模块
import 模块名 as 模块别名 #导入模块并使用
from…import 导入
from 模块名 import 成员 1,成员 2,…
from 模块名 import *
import 导入的是模块。from...import 导入的是模块中的一个函数/一个类。
__import__()动态导入
s = "math" #字符串
m = __import__(s) #导入后生成的模块对象的引用给变量 m
print(m.pi)
一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象
重新加载 有时候我们确实需要重新加载一个模块,这时候可以使用:importlib.reload() 方法:
包
1、import a.aa.module_AA
在使用时,必须加完整名称来引用,比如:a.aa.module_AA.fun_AA()
2. from a.aa import module_AA
在使用时,直接可以使用模块名。 比如:module_AA.fun_AA()
3. from a.aa.module_AA import fun_AA 直接导入函数
在使用时,直接可以使用函数名。 比如:fun_AA()
导入包的本质其实是“导入了包的__init__.py”文件。
包的本质还是模块
用*导入包
import * 这样的语句理论上是希望文件系统找出包中所有的子模块,然后导入它们。 这可能会花长时间等。Python 解决方案是提供一个明确的包索引。
这个索引由 __init__.py 定义 __all__ 变量,该变量为一列表,如上例 a 包下的 __init__.py 中,可定义 __all__ = ["module_A","module_A2"]
这意味着, from sound.effects import * 会从对应的包中导入以上两个子模块
包内引用
sys.path 和模块搜索路径