现在的位置: 首页 > 综合 > 正文

从C#到Python —— 5 模块和包

2013年07月19日 ⁄ 综合 ⁄ 共 3173字 ⁄ 字号 评论关闭

 

本章是《从C#到Python》系列连载的最后一章,内容较简单,主要介绍Python中模块与包的使用方法。如果你对这部分内容已经比较熟悉,就不要再浪费时间看了,写这一章只是为了整个系列完整而已,没什么新的东西(本章内容主要参考了《Python精要参考》的第八章《模块和包》)。

 

5.1  模块

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

模块名与脚本的文件名相同,例如我们编写了一个名为Items.py的脚本,则可在另外一个脚本中用import Items语句来导入它。在导入时,Python解释器会先在脚本当前目录下查找,如果没有则在sys.path包含的路径中查找。

在导入模块时,Python会做以下三件事:
(1) 为模块文件中定义的对象创建一个名字空间,通过这个名字空间可以访问到模块中定义的函数及变量;
(2) 在新创建的名字空间里执行模块文件;
(3) 创建一个名为模块文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量,如:

1 import sys
2  print sys.path

如果要同时导入多个模块,可以用逗号分隔,如: import sys, os ;

可以使用as关键字来改变模块的引用对象名,如:import os as system ;

也可以用from语句将模块中的对象直接导入到当前的名字空间(不创建模块名字空间的引用对象),如:from socket import gethostname ;

from语句支持逗号分割的对象,也可以使用星号(*)代表模块中除下划线开头的所有对象,如:from socket import *,这是个懒省事的方法,我是经常用,不过用之前最好先搞清楚会不会覆盖当前名字空间中的函数名等,总之不是个好习惯:)

除了Python脚本(不仅限于py,还包括pyc和pyo),import语句还可以导入C或C++扩展(已编译为共享库或DLL文件)、包(包含多个模块,一会介绍)和内建模块(使用C编写并已链接到Python解释器内)。不过除了包,另外两个我也没用过:(

Python解释器在第一次import一个py文件的时候,会尝试将其编译为字节码文件,这个文件的扩展名通常为.pyc,它是已经完成语法检查并转译为虚拟机指令的代码。后边的导入操作会直接读取.pyc文件而不是.py文件,一般而言速度会更快。

 

5.2  包

Python的模块可以按目录组织为包(package)。一般来说,我们将多个关系密切的模块组织成一个包,以便于维护和使用,同时可有效避免名字空间冲突。创建一个包的步骤是:建立一个名字为包名字的文件夹,并在该文件夹下创建一个__init__.py文件,你可以根据需要在该文件夹下存放脚本文件、已编译扩展及子包。

一个典型的包可能有以下结构:

1 package1/
2 __init__.py
3 subPack1/
4 __init__.py
5 module_11.py
6 module_12.py
7 module_13.py
8 subPack2/
9 __init__.py
10 module_21.py
11 module_22.py
12 ……

只要目录下存在__init__.py,就表明此目录应被作为一个package处理。在最简单的例子中,__init__.py 是一个空文件,不过一般我们都要在__init__.py中做一些包的初始化动作,或是设定一些变量。

最常用的变量是__all__。当使用包的人在用from pack import * 语句导入的时候,系统会查找目录pack下的__init__.py文件中的__all__这个变量。__all__是一个list,包含了所有应该被导入的模块名称,例如:__all__ = ["m1", "m2", "m3"] 表示当from pack import * 时会import 这三个module。

如果没有定义__all__,from pack import * 不会保证所有的子模块被导入。所以要么通过__init.py__,要么显式地import 以保证子模块被导入,如:import pack.m1,  pack.m2,  pack.m3。

 

5.3  本章小结

本章介绍了Python中模块与包的使用方法,要点如下:

(1) 模块是一个可以导入的Python脚本文件;
(2) 包是一堆按目录组织的模块和子包,目录下的__init__.py文件存放了包的信息;
(3) 可以用import, import as , form import 等语句导入模块和包。

总之,模块与包是在物理上组织Python代码复用的一种有效方式,它有点类似于C#中的程序集(Assembly)。初学Python不一定要会自己建立模块和包,但一定要学会使用各种包,这正是Python的强大之处:Python带着各种各样的battery。当你想完成一项功能时,最好先去搜索是不是有相关的包能够复用(多数情况下是这样的,因为在各种领域都有太多的人在为Python作着贡献)。而且,绝大多数Python包都是开源的,研读优秀的代码也是提高编程能力的一种有效途径。

 

进一步阅读的参考:

《从C#到Python》系列连载到今天就全部写完了,非常感谢各位的支持、鼓励以及批评,使我能够不断完善和提高。读完这个连载,在Python的语法上应该够应付一阵了,当然结合具体的应用领域,还是有很多东西需要不断学习,在此向大家推荐一些有用的读物:

[1] 科学计算方面:这个是我的应用Python的主阵地,推荐HYRY Studio的《用Python做科学计算》(见http://pyscin.appspot.com/html/index.html),我个人认为非常优秀的一本原创著作(这么好的书不知为何不正式出版,钦佩作者的rp !)。

[2] GUI开发方面:如果你用wxPython,那么肯定要看《wxPython in Action》(中文版见http://wiki.woodpecker.org.cn/moin/WxPythonInAction);而我个人主要用PyQt4,这方面值得推荐的读物是柴树杉翻译的《PyQt4 编程简介》(见http://pyqt-doc-cn.googlecode.com/svn/trunk/Introduction_to_PyQT4/doc/r54/index.html)。如果英文好,还是推荐看《Rapid GUI Programming with Python and Qt》(英文pdf版下载地址:http://householdcommandmodule.googlecode.com/files/Rapid.GUI.Programming.with.Python.and.Qt.Oct.2007.pdf)。

[3] Web开发方面:这个我还没有涉及,Django的资料网上也是大把了,其它的Python Web开发框架也是多如牛毛,自己找找吧:)

[4] 移动开发方面:最近准备用PyS60做点小东西,不过一直抽不出时间来,下载了《PyS60 Library Reference》(中文版地址:http://www.woodpecker.org.cn:9081/doc/Python/_PDF/PythonForS60_1_4_1_CN_doc.pdf),一直没时间看呢,所以不好推荐,不过官方的东西应该是差不了的。另外园子里Lucker的blog上有一些关于PyS60开发的不错文章,我虽收藏了,但也是一直没时间详细看,呵呵,以后再说了。

最后声明:虽然写的不咋地,不过好歹也是花了我很多时间和心血的,所以希望转载的朋友请注明出处

 

连载完

抱歉!评论已关闭.