python模块介绍和操作详解 – Python入门开发教程

上一章Python教程请查看:python函数定义和操作
模块允许你逻辑地组织Python代码,将相关代码分组到一个模块中可以使代码更容易理解和使用,模块是具有任意命名属性的Python对象,你可以绑定和引用这些属性。
简单地说模块就是由Python代码组成的文件,模块可以定义函数、类和变量,模块还可以包含可运行代码。
名为aname的模块的Python代码通常驻留在名为aname.py的文件中,下面是一个简单模块support.py的示例

def print_func( par ): print "Hello : ", par return

1、import语句通过在其他Python源文件中执行import语句,可以将任何Python源文件用作模块,import具有以下语法
import module1[, module2[,... moduleN]

当解释器遇到import语句时,如果模块出现在搜索路径中,它就会导入模块。搜索路径是解释器在导入模块之前搜索的目录列表,例如导入support.py模块,你需要将以下命令放在脚本的顶部:
#!/usr/bin/python# 导入support模块 import support# 现在你可以调用定义的函数,如下所示support.print_func("Van Gogh")

不管导入模块的次数如何,模块只加载一次,这可以防止在出现多个导入时重复执行模块。
2、from…import语句Python的from语句允许你将特定的属性从模块导入到当前名称空间,from…import有以下语法
from modname import name1[, name2[, ... nameN]]

例如要从fib模块导入函数fibonacci,可以使用以下语句
from fib import fibonacci

该语句不将整个模块fib导入当前命名空间,它只是将fib模块中的fibonacci项引入到导入模块的全局符号表中。
3、from…import*语句也可以使用以下import语句将模块中的所有名称导入到当前名称空间中:
from modname import *

这为将模块中的所有项导入到当前名称空间提供了一种简单的方法,然而这个语句应该谨慎使用。
4、定位模块当你导入模块时,Python解释器将按照以下顺序搜索模块
  • 当前目录。
  • 如果没有找到模块,Python将在shell变量PYTHONPATH中搜索每个目录。
  • 如果其他方法都失败,Python将检查默认路径,在UNIX上,这个默认路径通常是/usr/local/lib/python/。
模块搜索路径以sys的形式存储在系统模块sys中,即路径变量sys.path变量包含当前目录、PYTHONPATH和安装相关的默认值。
5、PYTHONPATH环境变量PYTHONPATH是一个环境变量,由一组目录组成,PYTHONPATH的语法与shell变量PATH的语法相同。
下面是一个典型的Windows系统的python路径:
set PYTHONPATH = c:\python20\lib;

这是一个典型的来自UNIX系统的PYTHONPATH
set PYTHONPATH = /usr/local/lib/python

6、名称空间和范围变量是映射到对象的名称(标识符),名称空间是由变量名(键)及其对应对象(值)组成的字典。
Python语句可以访问局部名称空间和全局名称空间中的变量,如果局部变量和全局变量具有相同的名称,则局部变量将对全局变量进行映射。
每个函数都有自己的本地名称空间,类方法遵循与普通函数相同的作用域规则。
Python对变量是局部变量还是全局变量进行了有根据的猜测,它假定在函数中赋值的任何变量都是局部的。
因此为了在函数中为全局变量赋值,必须首先使用全局语句。
语句global VarName告诉Python VarName是一个全局变量,Python停止搜索变量的本地命名空间。
例如我们在全局名称空间中定义了一个变量Money,在Money函数中,我们为Money赋值,因此Python假设Money是一个局部变量。但是我们在设置本地变量Money之前访问了它的值,因此结果是UnboundLocalError,取消全局语句的注释可以修复问题。
#!/usr/bin/pythonMoney = 2000 def AddMoney(): # 取消注释以下行修复代码: # global Money Money = Money + 1print Money AddMoney() print Money

7、dir()函数内置函数dir()返回一个已排序的字符串列表,其中包含模块定义的名称。
该列表包含模块中定义的所有模块、变量和函数的名称,下面是一个简单的例子:
#!/usr/bin/python# 导入内置math模块 import mathcontent = dir(math) print content

以上打印的输出中特殊的字符串变量_name__是模块的名称,而_file__是加载模块的文件名。
8、globals()和locals()函数可以使用globals()和locals()函数根据调用它们的位置返回全局和局部名称空间中的名称。
如果在一个函数中调用了locals(),那么它将返回可以从该函数本地访问的所有名称。
如果在函数中调用globals(),它将返回可以从该函数全局访问的所有名称。
这两个函数的返回类型都是dictionary,因此可以使用keys()函数提取名称。
9、reload()函数当模块被导入到脚本中时,模块顶层的代码只执行一次。
因此如果希望重新执行模块中的顶级代码,可以使用reload()函数,函数的作用是:再次导入先前导入的模块,reload()函数的语法是这样的:
reload(module_name)

这里module_name是要重新加载的模块的名称,而不是包含模块名称的字符串。例如要重新加载hello模块,请执行以下操作:
reload(hello)

10、Python中的包包是一个分层的文件目录结构,它定义了一个由模块、子包和子子包等组成的Python应用程序环境。
考虑phone目录中提供的一个文件pots .py,这个文件有以下一行源代码
#!/usr/bin/pythondef Pots(): print "I'm Pots Phone"

类似地我们还有另外两个文件,它们具有不同的功能,但名称相同
  • 具有Isdn()函数的phone/Isdn.py文件
  • 具有函数G3()的phone/G3.py文件
现在在phone目录下创建另一个文件_init_ .py: phone/ __init__ . py
要在导入Phone时使所有功能可用,你需要在_init_ .py中放入显式的导入语句,如下所示
from Pots import Pots from Isdn import Isdn from G3 import G3

在你将这些行添加到_init__.py之后,当你导入phone包时,所有这些类都是可用的。
#!/usr/bin/python# 导入phone包 import PhonePhone.Pots() Phone.Isdn() Phone.G3()

【python模块介绍和操作详解 – Python入门开发教程】在上面的示例中,我们以每个文件中的单个函数为例,但是你可以在文件中保留多个函数。你还可以在这些文件中定义不同的Python类,然后可以根据这些类创建包。

    推荐阅读