模块
在上一章,你已经了解了如何在你的程序中通过定义一次函数工作来重用代码。那么如果你
想在你所编写的别的程序中重用一些函数的话,应该怎么办?正如你可能想象到的那样,答
案是模块(Modules)。
编写模块有很多种方法,其中最简单的一种便是创建一个包含函数与变量、以 .py 为后缀的
文件。
另一种方法是使用撰写 Python 解释器本身的本地语言来编写模块。举例来说,你可以使用 C
语言来撰写 Python 模块,并且在编译后,你可以通过标准 Python 解释器在你的 Python 代
码中使用它们。
一个模块可以被其它程序导入并运用其功能。我们在使用 Python 标准库的功能时也同样如
此。
按字节码编译的 .pyc 文件
导入一个模块是一件代价高昂的事情,因此 Python 引入了一些技巧使其能够更快速的完成。
其中一种方式便是创建按字节码编译的(Byte-Compiled)文件,这一文件以 .pyc 为其扩展
名,是将 Python 转换成中间形式的文件。这一 .pyc 文件在你下一次从其它不同的程序导入模块时非常有用——它将更加
快速,因为导入模块时所需要的一部分处理工作已经完成了。同时,这些按字节码编译的文
件是独立于运行平台的。
注意:这些 .pyc 文件通常会创建在与对应的 .py 文件所处的目录中。如果 Python 没有相
应的权限对这一目录进行写入文件的操作,那么 .pyc 文件将不会被创建。
from..import 语句
如果你希望直接将 argv 变量导入你的程序(为了避免每次都要输入 sys. ),那么你可以
通过使用 from sys import argv 语句来实现这一点。
警告:一般来说,你应该尽量避免使用 from...import 语句,而去使用 import 语句。
这是为了避免在你的程序中出现名称冲突,同时也为了使程序更加易读。
模块的 __name__
每个模块都有一个名称,而模块中的语句可以找到它们所处的模块的名称。这对于确定模块
是独立运行的还是被导入进来运行的这一特定目的来说大为有用。正如先前所提到的,当模
块第一次被导入时,它所包含的代码将被执行。我们可以通过这一特性来使模块以不同的方
式运行,这取决于它是为自己所用还是从其它从的模块中导入而来。这可以通过使用模块的
__name__ 属性来实现。
编写你自己的模块
编写你自己的模块很简单,这其实就是你一直在做的事情!这是因为每一个 Python 程序同时
也是一个模块。你只需要保证它以 .py 为扩展名即可。
dir 函数
内置的 dir() 函数能够返回由对象所定义的名称列表。 如果这一对象是一个模块,则该列
表会包括函数内所定义的函数、类与变量。
该函数接受参数。 如果参数是模块名称,函数将返回这一指定模块的名称列表。 如果没有提
供参数,函数将返回当前模块的名称列表。
包
现在,你必须开始遵守用以组织你的程序的层次结构。变量通常位于函数内部,函数与全局
变量通常位于模块内部。如果你希望组织起这些模块的话,应该怎么办?这便是包
(Packages)应当登场的时刻。
包是指一个包含模块与一个特殊的 __init__.py 文件的文件夹,后者向 Python 表明这一文
件夹是特别的,因为其包含了 Python 模块。
让我们这样设想:你想创建一个名为“world”的包,其中还包含着 “asia”、“africa”等其它子
包,同时这些子包都包含了诸如“india”、 “madagascar”等模块。
总结
如同函数是程序中的可重用部分那般,模块是一种可重用的程序。包是用以组织模块的另一
种层次结构。Python 所附带的标准库就是这样一组有关包与模块的例子。