Python编程基础与应用
上QQ阅读APP看书,第一时间看更新

1.2.2 程序结构特点

1-3 程序结构特点

Python的程序由包(对应文件夹)、模块(即一个Python文件)、函数和类(存在于Python文件中)等组成,如图1-16所示。包是由一系列模块组成的集合,模块是处理某一类问题的函数和类等的集合。需要注意的是,包中必须至少含有一个“__init__.py”文件,该文件的内容可以为空,用于标识当前文件夹是一个包。

1.Python程序的构架

Python程序的构架是指将一个程序分割为源代码文件的集合以及将这些部分连接在一起的方法。Python的程序构架示意如图1-17所示。

图1-16 Python包结构示意图

图1-17 Python程序的构架示意

2.模块

模块是Python中最高级别的组织单元,它将程序代码和数据封装起来以便重用。其实,每一个以扩展名“.py ”结尾的Python文件都是一个模块。

模块具有以下3个角色。

1)代码重用。

2)系统命名空间的划分(模块可理解为变量名封装,即模块就是命名空间)。

3)实现共享服务和共享数据。

图1-18描述了模块内的情况以及与其他模块的交互,即模块的执行环境。模块可以被导入,也会导入和使用其他模块,而这些模块可以用Python或其他语言(如C语言)编写。

图1-18 模块及其交互

3.import(导入)

一个文件可通过导入一个模块(文件)读取这个模块的内容,导入从本质上讲,就是在一个文件中载入另一个文件,并且能够读取那个文件的内容。一个模块内的内容通过这样的特性(object.attribute)能够被外界使用。import(导入)是Python程序结构的重点所在。

import模块共有4种方式,分别如下所示。

(1)import X

导入模块X,并在当前命名空间(Namespace)创建该模块的引用。

(2)from X import*

导入模块X,并在当前命名空间,创建该模块中所有公共对象(名字不以__开头)的引用。

(3)from X import a, b, c

导入模块X,并在当前命名空间创建该模块给定对象的引用。

(4)X=__import__('X')

类似(1),但本方式显式指定了X为当前命名空间中的变量。

import模块时,Python解释器首先会检查module registry(sys.modules)部分,查看是否该模块先前就已经导入,如果sys.modules中已经存在(即已注册),则使用当前存在的模块对象即可。如果sys.modules中还不存在,则分以下三步来执行。

第一步,创建一个新的、空的模块对象(本质上是一个字典)。

第二步,在sys.modules字典中插入该模块对象。

第三步,加载该模块代码所对应的对象(如果需要,可以先编译好(编成字节码))。

然后在新的模块命名空间执行该模块代码对象(Code Object)。所有由该代码指定的变量均可以通过该模块对象引用。

import模块时,模块搜索路径顺序一般如下。

1)程序的主目录:即程序(顶层)文件所在的目录(有时候不同于当前工作目录(指启动程序时所在目录))。

2)PYTHONPATH(环境变量)预设置的目录。

3)标准链接库目录。

4)任何.pth文件的内容(如果存在):安装目录下找到该文件,以行的形式加入所需要的目录即可。