模块就是程序
模块是更高级的封装。说到封装,我们学了什么类型的封装:
- 容器(列表、元组、字符串、字典等),是对数据的封装
- 函数,是对语句的封装
- 类,是对方法和属性的封装,也就是对函数和数据的封装
现在我们要学的模块,就是程序的封装,保存的每一个 .py 结尾的文件,都是一个独立的模块。
命名空间
命名空间(namespace) 表示 标识符(identifier) 的可见范围。一个标识符可在多个命名空间中定义,它 在不同命名空间中的含义是互不相干的。
在 Python 中,每个模块都会维护一个独立的命名空间,如果你只是通过 import 模块名 来导入的话,要用 模块名.函数名 才能正常使用模块中的函数。
导入模块
导入模块有三种方法。
-
import 模块名
- 直接使用 import,但是在调用模块中的函数时,要加上模块的命名空间
- 这种方法如果模块名太长的话,不是很方便
-
from 模块名 import 函数名
- 这种导入方法会直接将模块的命名空间覆盖过来,调用时不用加上命名空间
- 函数名用通配符 星号* 代替可以导入模块的所有命名空间,这样可能会陷入名字混乱的局面,不建议
-
import 模块名 as 新名字
- 这种方法可以给命名空间取个较简单的新名字,又不会污染命名空间,建议使用
__name__=’__main__’
模块是用来 组织 Python 的代码,还能 实现代码的重用。
但是模块可以导入模块,在运行模块的时候可能会执行导入模块的测试语句。
所以,要使用模块的 __name__属性。如果模块是主模块,__name__ = ‘__main__’。
因而模块中经常见到:if __name__==’__main__’ 这句代码,这个 if 语句下再写测试语句,这样在别人调用自己的模块时,就不会执行测试语句了。
搜索路径
Python 模块的导入需要一个路径搜索的过程。在 Python 预定义好的搜索路径 中寻找对应的模块文件:如果有,则导入;如果没有,则导入失败。
而这个搜索路径,就是一组目录,可以通过 sys 模块中的 path 变量显示出来(不同的机器上显示的路径信息可能不同)
- 列出的这些路径都是 Python 在导入模块操作时回去搜索的。但是 site-package 目录是最佳选择,因为它生来就是做这些事情的。
- 搜索路径也是可以扩展的,使用 sys.path.append() 就可以扩展搜索路径了。
包
实际上,一个大型的系统有成千上万的模块也是很正常的事。单单用模块来定义 Python 的功能显然还不够,如果都放在一起显然不好管理,而且还有命名冲突的可能。因此,Python 也出现了包的概念。
Python 中的包的实现要比 Java 中更为简洁。如何创建一个包:
- 创建一个文件夹用于存放相关模块,文件夹的名字就是包的名字
- 在文件夹中创建一个 __init__.py 的模块文件,内容可以为空
- 这一步是必要的,内容可以为空,也可以写一些初始化代码。这一条是 Python 的规定,这样子可以告诉 Python 这个文件夹是包
- 将相关模块放入文件夹中
像个极客一样去思考
“Python 自己带着电池”,Python 附带安装了 Python 标准库。标准库中的模块极其有用,现在我们要学习:如何自主学习这些模块?
利用 Python 的官方文档,与 Java Document 一样。Python 的官方文档由几部分组成:
-
What’s new in Python 3.7? or all “What’s new” documents since 2.0
- Python3.7 的新内容,或者是列举 2.0 document 的新内容
-
Tutorial
- Python 的基本语法
-
Library Reference
- Python 官方枕边书,详细列举了 Python 所有内置函数和标准库的各个模块
-
Installing Python Modules
- 安装第三方模块
-
Disturbing Python Modules
- 发布第三方模块
-
Language Reference
- 讨论 Python 的语法与设计哲学
-
Python Setup and Usage
- 各个平台上 Python 的安装和使用
-
Python HOWTOs
- 深入探讨一些特定主题
-
Extending and Embedding
- 介绍如何用 C 和 C++ 开发 Python 的扩展模块
-
FAQs
- 常见问题的解决
-
另外值得一提的是 PEP(Python Enhancement Proposal),Python 的增强建议书,用来规范与定义 Python 的各种增强与延伸功能的技术规格,让 Python 统一
- PEP1 是 PEP 本身的规范定义
- PEP3000 是 Python3 的相关技术规格
- PEP8 定义了 Python 代码的风格指南
-
对一个模块查看 __all__ 属性,可以直接获取可供调用接口的信息
- 不是所有的模块都有,建议编写这个属性
- from 模块名 import * :只导入 __all__ 属性这个列表里的名字(如果没有,则导入所有不以下划线开头的名字)
-
模块的 __all__ 属性可以查看源代码位置