模块

Python提供了强大的模块支持, 不仅标准库中包含了大量的模块, 还有大量的第三方模块, 开发者还可以自定义模块. 通过这些强大的模块可以极大地提高开发效率.

什么是模块?

  • 模块就是Python程序, 任何Python程序都可以作为模块;

一个Python文件就是一个模块, 文件名(不包括扩展名.py)就是模块名. 例如, hello.py文件就是一个名为hello的模块.

Within a module, the module’s name(as a string) is available as the value of the global variable __name__.

注解

导入模块时, 可能发现其所在目录中除了源代码之外, 还新建了一个名为__pycache__的子目录.

这个目录中包含处理后的文件, Python能够更高校地处理它们. 以后再导入这个模块时, 如果.py文件没有发生变化, Python将导入处理后的文件, 否则将重新生成处理后的文件. 删除目录__pycache__不会有任何害处, 因为必须时会重新创建它们.

  • 模块是用来定义的(而非用来执行操作的);

如果模块中有可执行的代码, 首次导入该模块时会执行这些代码, 但再次导入时就不会执行了. 因为模块不是用来执行操作的, 而是用来定义变量, 函数, 类等的, 模块只导入一次.

注解

A module can contain exectuables statements as well as function definitions. These statements are intended to initialize the module. The are executed only the first time the module name is encounter in an import statement.

  • 模块会引入新的作用域.

模块像类一样有自己的作用域, 这意味着可以在模块作用域中定义变量, 函数和类, 作为该模块的属性.

在模块中添加测试代码

模块主要是用来定义变量, 函数和类等,但在有些情况下(实际上是经常), 添加一些测试代码来检查情况是否符合预期很有用; 但当导入模块时, 测试代码也会执行, 这不是我们想要的结果. 为了避免这种行为, 可以检查模块是作为程序来运行的还是被导入的, 可以使用模块的__name__属性, 如果模块是作为程序运动的, 其值是__main__; 如果是被导入的, 其值就是模块名. 可以在模块中增加if语句, 判断__name__属性的值, 当模块作为程序运行时再执行测试代码.

模块和封装

模块, 是代码归集的一种方法.

有很多具有封装特性的结构, 比如说:

  • 诸多容器, 例如列表, 元组, 字符串, 字典等, 它们是对数据的封装;
  • 函数是对Python代码的封装;
  • 类是对方法和属性的封装, 也可以说是对函数和数据的封装.

模块, 可以理解为是对代码更高级的封装, 即把能够实现某一个特定功能的代码编写在同一个.py文件中, 并将其作为一个独立的模块, 这样既可以方便其它程序导入使用, 同时还能够有效避免函数名和变量名发生冲突.

模块可以比作一盒积木, 通过它可以拼出多种主题的玩具, 一个函数相当于一块积木, 而一个模块(.py文件)中可以包含多个函数, 也就是很多块积木.

在编写程序时, 随着程序功能的复杂, 程序的体积会不断增大, 为了便于维护, 通常会将其分为多个文件(模块), 这样不仅可以提高代码的可维护性, 还可以提高代码的可重用性.

注解

代码的可重用性体现在, 当编写好一个模块后, 只要编程过程中需要用到该模块中的某个功能(由变量, 函数, 类实现), 无需做重复性的编写工作, 直接在程序中导入该模块即可使用该功能.

自定义模块

任何一个Python文件都是一个Python模块, 文件名(不包括.py后缀)就是模块名.

为自定义模块编写说明文档

在定义函数或类的时候, 可以为其添加说明文档; 对于自定义模块, 也可以为其添加说明文档, 和函数或类的添加方法相同, 即只需在模块开头的位置定义一个文档字符串即可.