模块
什么是模块
-
在前面我们经常脚是用 python 解释器来编程(理解:>>>的形式,最原始的形式,从cmd处打开),如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。
为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。
-
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。
-
模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。
-
下面是一个使用 python 标准库中模块的例子。
import sys
print('命令行参数如下:')
for i in sys.argv:
print(i)
print('\n\nPython 路径为:', sys.path, '\n')
- import sys 引入 python 标准库中的 sys.py 模块;这是引入某一模块的方法。
- sys.argv 是一个包含命令行参数的列表。
- sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表。
-
import 和 from … import 和 from … import * 三者的区别【举例:假设三者都 import fibo】
功能 举例 import … 导入整个模块。调用函数时需用【模块名.函数名】 fibo.fibo2(9) from … import 只会导入某个模块中的某些函数等。调用时可直接【函数名】 fibo2(9) from … import * 导入某个模块中的所有函数等。调用时可直接【函数名】 fibo2(9)
import
-
一个模块只会被导入一次,不管你执行了多少次import。
-
当我们使用import语句的时候,Python解释器是怎样找到对应的文件的?
-
现在,在解释器的当前目录或者 sys.path 中的一个目录里面来创建一个fibo.py的文件,代码如下:
from … import
from … import *
深入模块
__name__属性
-
问题:
我们现在知道,程序的运行可能需要调动多个模块,也就是多个 .py 文件。
假设我们运行 A.py ,其中 A.py 需调用 B.py 那么当 B模块 被 A模块 第一次引入时,B.py 的主程序将运行。
如果我们不想让 B.py 里的所有代码都执行,即:B模块,作为被调用方时,有选择地执行代码。该如何呢?
我们可以利用 模块的 __name__属性 来解决这一问题。
-
解决方案:
每个模块 都有一个__name__属性 ,当其值是 _main_ 时,表明该模块自身在运行,否则是被引入。
说明:_name_ 与 _main_ 底下是双下划线, _ _ 是这样去掉中间的那个空格。
dir( ) 函数
内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:
标准模块
包
-
包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。
比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。
就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。
-
举例
这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。
不妨假设你想设计一套统一处理声音文件和数据的模块(或者称之为一个"包")。
现存很多种不同的音频文件格式(基本上都是通过后缀名区分的,例如: .wav,:file:.aiff,:file:.au,),所以你需要有一组不断增加的模块,用来在不同的格式之间转换。
并且针对这些音频数据,还有很多不同的操作(比如混音,添加回声,增加均衡器功能,创建人造立体声效果),所以你还需要一组怎么也写不完的模块来处理这些操作。
-
这里给出了一种可能的包结构(在分层的文件系统中):
从一个包中导入*
-
设想一下,如果我们使用 from sound.effects import *会发生什么?
Python 会进入文件系统,找到这个包里面所有的子模块,一个一个的把它们都导入进来。
但是很不幸,这个方法在 Windows平台上工作的就不是非常好,因为Windows是一个大小写不区分的系统。
在这类平台上,没有人敢担保一个叫做 ECHO.py 的文件导入为模块 echo 还是 Echo 甚至 ECHO。
(例如,Windows 95就很讨厌的把每一个文件的首字母大写显示)而且 DOS 的 8+3 命名规则对长模块名称的处理会把问题搞得更纠结。
-
为了解决这个问题,只能烦劳包作者提供一个精确的包的索引了。
导入语句遵循如下规则:如果包定义文件 init.py 存在一个叫做 all 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。
-
作为包的作者,可别忘了在更新包之后保证 all 也更新了啊。你说我就不这么做,我就不使用导入*这种用法,好吧,没问题,谁让你是老板呢。
-
这里有一个例子,在:file:sounds/effects/init.py中包含如下代码: