本章是《从C#到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 的语法上应该够应付一阵了,当然结合具体的应用领域,还是有很多东西需要不断学习
近期评论