4.4.2 Python 程序架构

简单程序可以只用一个程序文件实现,但对绝大多数 Python 程序,一般都是由多个源 文件(即模块)组成的,其中每个源文件都是包含 Python 语句的文本文件。

具体来说,Python 程序通常是由一个顶层主文件和多个模块文件组成的。顶层主文件 定义了程序的主控制流,是执行应用程序时的启动文件;模块文件则是“工具”库,用于汇 集顶层文件和其他模块需要用到的函数等部件。顶层文件使用模块文件中定义的工具来完成 应用功能,同时一个模块也可使用别的模块定义的工具。

模块文件一般不能直接执行,模块中只是定义了很多工具给其他模块使用。Python 中 通过导入模块来使用该模块定义的工具。图 4.12 描绘了一个由三个文件(a.py、b.py 和 c.py)组成的 Python 程序,其中 a.py 是顶层文件,b.py 和 c.py 是模块。b.py 和 c.py 一般不能直接执行,该程序的执行只能通过 a.py 来启动。

图 4.12 Python 程序架构

假设文件 b.py 中定义了一个函数 hello 给外部使用:

def hello(person):
    print "Hello", person

再假设 a.py 正好需要使用 hello(),为此可以在 a.py 中导入模块 b,然后调用 hello():

import b
b.hello("Lucy"')

其中的导入语句使得 a.py 能够访问 b.py 中顶层代码所定义的所有名字(这里只有 hello)。a.py 的第二条语句调用模块 b 中定义的函数 hello,其中 b.hello()这种“点 表示法”其实是面向对象的表示法,b 是一个模块对象,hello 则相当于 b 对象的一个属 性。b.hello 就等于说“对象 b 中的属性 hello 的值”,这个值恰好是一个可调用的函数, 因此可以传递一个字符串参数"Lucy"'给它。

任何模块文件都可以从任何其他模块文件导入定义,例如文件 a.py 可导入 b.py, b.py 也可以导入 c.py。导入链条可以任意深入下去:a 导入 b,b 导入 c,c 导入 b,等 等。

除了作为最高层结构单元,模块还是代码重用的最高层形式。例如,如果很多模块都需 要使用函数 b.hello,那我们可以在别处导入 b.py,从而达到代码重用的目的。