第五章 模块与包

       Python的脚本都是用扩展名为py的文本文件保存的,一个脚本可以单独运行,也可以导入另一个脚本中运行。当脚本被导入运行时,我们将其称为模块(module)。模块是Python组织代码的基本方式。

       Python的程序是由包(package)、模块(module)和函数组成.包是由一系列模块组成的集合。模块是处理某一类问题的函数和类的集合。

       包就是一个完成特定任务的工具箱,Python提供了许多有用的工具包,如字符串处理、图形用户接口、WEB接口、图形图像处理等。使用这些工具包,可以提高程序员的开发效率、减少编程的复杂度、达到代码重用的效果。这些自带的工具包和模块安装在Python的安装目录下的Lib子目录中。

       例如,Lib目录中的xml 文件夹就是一个包,这个包用于完成XML的应用开发。Xml包中有几个子包:dom、sax、etree和parser。文件init.py(注意是两个下滑线)是xml包的注册文件,如果没有该文件,Python将不能识别xml包。在系统字典中定义了xml包。

       包必须至少含有一个init.py文件,该文件的内容可以为空。init.py用于表示当前文件夹是一个包。

对于模块的理解

       用简单的说法来说,每一个以扩展名为.py结尾的Python源代码都是一个模块。其他的文件可以通过导入一个模块读取这个模块的内容。导入从本质上来讲,就是载入另一个文件,并能够读取那个文件的内容。一个模块的内容通过这样的的属性能够被外部世界使用。

比如我们举一个简单的例子,首先建立一个python文件define.py

#-*-coding:utf-8-*-
myvar="这是一个测试"

很简单的代码就二行,我们定义了一个变量myvar.现在我们通过另一个python文件来导入它。

#-*-coding:utf-8-*-
import sys
import define
def Main():
    print define.myvar
    print dir(define)
    print define.__file__
if __name__=="__main__":
    Main()
import define #这一行语句的意义在于导入define.py这个模块

print define.myvar#这一行的意义在于打印myvar这个变量

print dir(define)#这一行的意义在于输出所有可以使用的变量

       输出结果,不言而喻。但是在默认情况下,只是在每次会话的第一次运行。在第一次导入之后,其他的导入都不会再工作。

       但是如果真的想要python在同一次会话中再次运行文件(不停止和重新启动会话),需要调用内置的reload函数。

模块的显要特性:属性

       导入和重载提供了一种自然的程序启动的选择,因为导入操作将会在最后一步执行文件。从更宏观的角度来看,模块扮演了一个工具库的角色。我们可以直接使用from define import myvar这条语句来实现。

#-*-coding:utf-8-*-
import sys
from define import myvar
def Main():
    print myvar
if __name__=="__main__":
    Main()

模块创建过程的例子

       模板把一组相关的函数或代码组织到一个文件中。一个文件即是一个模板。模块由代码、函数或类组成。例如,创建一个名为myModule.py的文件,即定义了一个名为myModule的模块。在该模块中定义一个函数func()和一个类MyClass。MyClass类中定义一个方法myFunc().

#-*-coding:utf-8-*-
import sys
def func():
    print "myModule.func()"
class MyClass:
    def myFunc(self):
        print "myModule.MyClass.myFunc()"

然后在myModule.py所在目录下创建一个名为call_myModule.py文件,在该文件中调用myModule模块的函数和类:

#-*-coding:utf-8-*-
import sys
import random
import myModule
if __name__=="__main__":
    myModule.func()
    myClass=myModule.MyClass()
    myClass.myFunc()

当python寻入一个模块时,python首先查找当前路径,然后查找lib目录、site-packages目录(python/lib/site-packages)和环境变量PYTHONPATH设置的目录。

模块的导入

在使用一个模块中的函数或类之前,首先要导入该模块。

import myModule

还可以使用from …import..语句将模块导入。

from module_name import *
from module_name import function_name

实现例子

#-*-coding:utf-8-*-
import sys
def func():
    print "myModule.func()"
class MyClass:
    def myFunc(self):
        print "myModule.MyClass.myFunc()"

#-*-coding:utf-8-*-
import sys
import random
from myModule import func
if __name__=="__main__":
    func()

模块的属性

模块中有许多内置的属性,用于完成特定的任务,如name doc_。每个模块都有一个名称。

#-*-coding:utf-8-*-
import sys
if __name__=="__main__":
    print __name__
    print __doc__
    print __file__
    print __package__