本文共 3638 字,大约阅读时间需要 12 分钟。
1、模块定义
有过其他语言的编程经验的朋友都知道,要想使用一些内置函数,就必须先引入这些函数所在的模块或头文件,比如C语言中,如果要使用pow这个函数,就必须先引入math.h这个头文件(#include<.math.h>)。而在Python中,这些都叫模块(module),并且都是使用关键字import引入某个模块的,下面让我们来了解一些Python的模块是怎么回事。
模块是Python中最高级别的程序组织单元,它将程序代码和数据封装起来以便重用,而模块就对应Python中的程序文件(.py文件),一旦在一个.py文件中导入了其他模块之后就可以在这个文件中使用导入模块中的变量或方法或类等。模块可以由两个语句和一个内置的函数reload()导入。
2、模块的名称空间
一个名称空间就是从名称到对象的关系映射集合。Python中每一个模块都定义了自己唯一的名称空间,所以不同的模块间,即使定义了相同的属性,同时引入这些模块后,也不会发生冲突。比如:
import pck1,pck2pck1.getName()pck2.getName()
上例中模块pck1.getName()和模块pck2.getName()两方法是不会冲突的,因为模块的命名空间是不一样。
3、搜索路径
模块在导入时,需要进行搜索路径操作。搜索路径就是import语句时,Python所查找的系统目录清单。如果在这些目录列表中都未找到需要导入的模块时,就会报未找到模块的错误:
ImportError: No module named myModule
Python搜索模块的路径的规则:
1). 程序主目录,即sys.path中第一个路径往往就是主模块所在目录。交互模式下对应当前目录。
2). 如果不在当前目录,Python就会搜索shell变量PYTHONPATH下的每个目录。
3). 如果都找不到,python会查安装路径lib下的site-packages。Unix下,默认路径一般是/usr/local/python/
模块搜索路径存在system模块的sys.path变量中。变量包含当前目录,PATHONPATH是由安装过程决定的默认目录。
PATHONPATH变量
作为环境变量,PYTHONPATH由装在一个列表里的许多目录组成。PYTHONPATH的语法和shell变量PATH的一样。 Windows下:set PYTHONPATH=c:\python27\lib;
UNIX下:
set PYTHONPATH=/usr/local/python
4、模块导入
Python中模块导入有三种方法:
(1)import 语句
想要使用Python源文件,只需要在另一个源文件里执行import语句,该导入语句导入的模块是放在模块的命名空间中。语法如下:import module1 [, module2 [,....modeleN]]
实例:
import math
这种导入,由于是把a模块中的内容都导入到a模块命名空间中,所以访问模块中的方法或属性时,必须使用这样的格式:
模块名.函数名
(2)from…import … 语句
Python的from语句让你从模块中导入一个指定的部分到当前命名空间中,也就是执行的.py文件的命名空间中。语法如下:from modname import name1 [, name2 [, ....]]
例如导入模块math模块中的sqrt函数,使用如下语句:
from math import sqrt
这个声明不会把整个math模块导入到当前的命名空间,而只会把math模块中的sqrt函数单个导入到执行这个声明的模块的全局符号表中。
from还有另一种导入方式:from math import *
表示将math模块中所有的部分都导入到当前命名空间中。但是这种导入不被推荐,为什么呢?我们用一个列子来说明。
假如现在我有两个模块,a.py 、b.py,这两个模块中都有一个叫getName()的方法,现在在c.py这个文件中使用from…import *导入,语句如下:from a import *from b import *
如果是这样导入的模块的话,就会产生一个副作用,就是后引入的模块中如果跟先引入的模块中有同名的属性或方法时,后引入的模块会覆盖先引入的模块中同名的内容。所以这种方法一般不被推荐使用。
使用from…import…这种方法导入模块后,由于是导入到了当前.py文件命名空间中,所以就可以直接使用模块中的函数或属性,不需要再使用模块名.函数名来调用模块中的函数了。
(3)reload()函数
当一个模块被导入到一个脚本,模块顶格部分的代码只会被执行一次。但是如果我想重新执行模块里的顶格部分的代码时,又该怎么办呢? 这个时候reload()函数就派上用场了,该函数会重新导入之前导入过的模块。语法如下:reload(module_name)
在这里,module_name要直接放模块的名字,而不是一个字符串形式,比如想重新载入math模块,如下:
reload(math)
注意:
导入模块的语句必须放在脚本的顶端。导入一个模块,模块中顶格写的代码(也就是没有缩进的)都会被执行一遍。一个模块只会被导入一次,不管你执行了多少次import,这样可以防止导入模块被一遍又一遍地执行,也就是说多次导入同一个模块,该模块只会被执行一次,也就是最早导入的那次。废话不多说,直接上例子: a.pydef a() : var1 = 10 print var1 return var1num = 6print num
b.py
def b() : var1 = 8 print var1 return var1
c.py
import bfrom a import *import aa.a()b.b()
执行一下c.py,结果如下:
6108
上面的结果表明,导入a、b模块时,都被执行了一次,当再次导入a模块时,a模块不再被执行了。
修改c.py如下:
from a import aa()
执行结果:
610
从上面两个例子可以看出,无论是import一个模块,还是from … import 一个具体的函数,或者是from … import *,所在的模块都会被执行一次。
再修改c.py如下:
import an = a.a()print nreload(a)
执行结果:
610106
结果看出,虽然顶层import 了a模块,被执行一次,但是使用reload函数以后,该模块又被从新执行了一次。
这里需要注意的是,reload函数能执行成功的前提是,必须是之前使用import导入一个模块了,而不是使用from…import导入一个模块。修改a.py如下:
var1=10print var1
修改b.py如下:
var1=20print var1
修改c.py如下:
from a import *from b import * import areload(a)print var1
执行结果:
10201020
前面的10和20 是因分别导入a、b模块打印的结果,后面的10是因为使用了reload函数,重新加载了a模块,所以又打印了一次,最后的20是因为c.py程序中的print var打印输出的b模块中的var1的值。
from a import *from b import *
上面这两种导入模块方式,是把要导入的内容存放到当前命名空间中,所以可以直接使用里面的函数等。
import a
这种导入模式方式,只是把a模块中的内容导入a模块的命名空间中,并不在当前命名空间中,所以调用时,需要使用模块名调用。
最后总结一下使用import和from…import…去区别:
转载地址:http://odmdi.baihongyu.com/