首页 > 代码库 > Python学习笔记(六)再谈Python模块

Python学习笔记(六)再谈Python模块

Python程序包含多个模块文件,一个主体、顶层文件实现主要控制流程、调用组件和工具,其他模块文件则提供组件和工具,python自带了许多实用的模块称为标准链接库。模块是python中最高级别的程序组织单元,将代码和数据封装起来以便重用。每一个文件都是一个模块,并且可以通过“导入"来使用其他模块的变量(顶层定义的所有变量)。模块被导入时就生成了一个模块对象。从抽象的角度看,模块的作用有:

1)代码重用-模块文件的代码可以永久保存,可以被多个客户端使用、任意的重新运行和重载

2)划分系统命名空间-从根本上讲,模块是封装了变量名的软件包,代码和对象都封装在模块内部,能够避免变量名的冲突。不精确导入文件的话,另一个模块文件是看不到某模块的变量的。

3)共享服务和数据-模块有利于跨系统共享组件,对于一个被多个函数和文件使用的全局对象,将其定义在一个模块文件中被多个客户端导入即可。


模块的三个重要语句和函数是:

import:使导入者整体的获得一个模块,一个模块只有在首次导入后有效,其后若需要更新模块则使用reload。客户端能够获得被导入模块变量名的读取权,被导入模块则看不到客户端的变量。程序第一次import某文件的步骤为:

(1)搜索-首先python必须先找到import所引用的模块文件,import语句只能给出名称,python使用标准模块搜索路径来找出对应的文件,搜索目录包括:程序主目录、标准链接库目录、PYTHONPATH目录(如果已设置)和任何已存在.pth文件的内容。上述四个组件组合起来就成了sys.path,前两者是自动定义的,后两者由用户自定义。python会在搜索路径中选择第一个符合文件名的文件导入,同一目录相同文件名(不同后缀)则加载最先出现的(左边的)。首先在主目录下搜寻(顶层文件所在目录或者交互模式所在目录),之后会从左到右搜索PYTHONPATH环境变量设置的目录,接着是标准连接库,最后是自定义.pth目录文件。import也支持重定义。

(2)编译(可选)-找到模块文件后,python会比较时间戳决定是否将该文件编译成字节码。如果发现了字节码文件,则直接加载字节码。

(3)运行-执行模块的字节码,所有语句依次执行

from:允许导入者从一个模块中获得特定的变量名,在客户端中创建新变量,只有变量名被复制了过来。语句”from model import *“则是时客户端获得model模块中所有赋了值的变量的copy,即把model模块的命名空间融入客户端模块,但不会导入以下划线”_“开头的变量,若定义了”__all__“则会首先读取其中的变量。无论复制多少各变量,from语句总是将整个模块导入内存。from语句的潜在威胁是:如果客户端中存在同名变量,则其值会被导入的值替换掉;和reload配合使用时则可能导入的时旧的变量值。如果使用from来取得模块中特定的变量名,必须记住的是只能读取模块中已经赋值的变量名。

reload():reload()是函数,不中止程序运行的情况下,强制重载某一已经导入的模块并重新运行,重载前模块一定要已经被导入了。通过reload,用户可以立即看到组件修改的结果,而无需停止整个程序。调用reload时,Python会重读该模块的源文件、重新执行其顶层语句,客户端程序中任何应用该模块对象的地方都会自动受到reload的影响。值得注意的是,之前通过from导入的变量则不受影响,依然是重载前的旧对象。再者,reload(model)只会重载model文件,而不会重载model文件中import的其他模块文件,所以可以把系统设计成自动重载子组件(即在每个模块中添加reload调用)或者编写工具自动进行传递性重载。

Python学习笔记(六)再谈Python模块