Python基础篇——Day11
模块化编程
一般流程
- 设计API(Application Programming Interface),进行功能描述
- 编码实现API中描述的功能
- 在模块中编写测试代码,并消除全局代码
- 使用私有函数实现不被外部客户端调用的模块函数
模块的创建和测试代码
每个模块都有相应的名称,可以通过特殊变量__name__获取,正常情况下,模块的名称对应源文件名,仅有一个例外,就是当一个模块被作为程序入口时,它的__name__值为“main”,我们利用这一特点,可以将模块源代码文件中的测试代码进行独立的处理,而不影响模块被其它程序调用
import语句导入
import语句的基本语法:
import 模块名 # 导入一个模块
import 模块1,模块2 # 导入多个模块
import 模块名 as 模块别名 # 导入模块并使用新名字
import加载的模块分为四个类别:
- 使用python编写的代码(.py文件)
- 已被编译为共享库或DLL的C或C++扩展
- 包好一组模块的包
- 使用C编写并链接到python解释器的内置模块
import的本质时使用了内置函数__import__()
通过import导入一个模块时,python解释器进行执行,最终生成一个对象,这个对象就是代表被加载的模块
from…import语句导入
导入的是模块中的一个函数或一个类
基本语法:
from 模块名 import 成员1,成员2,...
from 模块名 import * # 导入一个模块中所有的成员
模块加载问题
当导入一个模块时,模块中的代码都会被执行,不过,如果再次导入这个模块,则代码不会再次执行
为什么这个设计?
因为导入模块更多的时候需要的是定义模块中的变量,函数,对象等,这些东西并不需要被反复定义和执行。所以只导入一次就成了一种优化
一个模块无论被导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象
如果确实需要多次加载,操作如下:
import math
import importlib
importlib.reload(math)
package的使用
当一个项目中有许多模块时,我们将功能类似的模块放到一起,就形成了”包“,本质上,”包“就是一个必须有__init__.py的文件夹,包下面可以包含模块,也可以再包含子包(subpackage),就像是文件夹下面可以有文件,也可以有子文件夹一样
导入包
导入包的本质其实是导入了包的__init__.py文件,即,当import package1时程序执行了包的__init__.py文件。这样可以在__init__.py中进行所需模块的批量导入,而不用一个一个导入
用*导入包
import *理论上时希望文件系统找出包中的所有子模块,然后导入它们。这可能会发较长时间。基于此,Python给出的解决方案是提供一个明确的包索引
这个索引由__init__.py 定义 all__变量,该变量为列表,如package1包下的__init.py中,可定义__all__=[“module A1”,“module A2”],这样,当from package1 import * 时,就可执行两个子包module A1和module A2的导入
sys.path和模块搜索路径
当我们导入某个模块时,Python解释器一般按照如下路径寻找该模块:
- 内置模块
- 当前目录
- 程序主目录
- pythonpath目录(如果已经设置pythonpath环境变量了)
- 标准链接库目录
- 第三方库目录
- .pth文件的内容(如果存在)
- sys.path.append()临时添加的目录
当任何一个程序启动时,会把上述的这些搜索路径(除内置模块)进行收集并放到sys模块的path属性中(sys.path)
模块的发布和安装
步骤:
- 为模块创建如下结构的文件夹
- 在文件夹中创建名为setup.py的文件,其内容如下:
from distutils.core import setup
setup(
name="flying_distance", # 对外发布的模块名
version="1.0", # 版本号
decription="这是一个对外发布的模块,用于计算距离",
author="c2h4ds",
author_email="xxxxxxx",
py_modules=["flying_distance.flying_distance1"] # 要发布的具体模块
)
- 构建一个发布文件,通过终端,cd到模块文件夹fb下面,再键入命令:
python setup.py sdist
然后就制作了一个发布文件
- 将发布的模块安装到本地,仍在cmd命令下操作,进入setup.py所在目录,键入命令:
pyhton setup.py install
即可安装在python/Lib/site-packages目录下