2.5.2 Python程序的构成
Python程序是由包、模块和函数组成的。Python的包和Java的包其作用是相同的,都是为了实现程序的代码复用。包必须含有__init__.py文件,它用于标识当前文件夹是一个包。
在Python的定义中,一个文件即一个模块,模块是由类、函数及程序组成的,此外,文件名是不能重复的,所以大家起名的时候要注意。
模块是Python中的重要概念,Python的程序是由一个个模块(即文件)组成的。模块的导入和Java中包的导入概念类似,都是使用的import语句。在Python中,如果需要在程序中调用标准库或其他第三方库的类,需要先使用import或from...import...语句导入相关的模块。
下面具体介绍这两种情况。
一是import后面紧接的是模块名(即文件名),举例如下:
import time
调用模块的函数或类时,程序需要以模块名作为前缀,例如time.time()等。
可以被import语句导入的模块有以下4类:
·使用Python写的程序(.py文件)。
·C或C++扩展(已编译为共享库或DLL文件)。
·包(包含多个模块)。
·内建模块(使用C编写并已链接到Python解释器内)。
用逗号分割模块名称就可以同时导入多个模块,示例如下:
import os,sys,time
模块导入时可以使用as关键字来改变其中引用对象的名字,示例如下:
import os as system
二是从模块(文件)中导入函数。该函数的语法为:from模块名import函数名。
使用这种方式时,不需要使用模块名作为前缀,示例如下:
from time import time,ctime
这样就可以直接调用time()函数了。
事实上,最完整的导入语法应该是:
from package.module import function
我们在工作中一般都简化为直接从模块名(或文件名)中导入函数。
Python中的模块搜索路径
导入模块时,解释器会搜索sys.path列表,这个列表中保存着一系列目录。一个典型的sys.path列表的值如下:
['', '/Library/Python/2.7/site-packages/pip-19.0.3-py2.7.egg', '/Library/Python/2.7/site-packages/six-1.12.0-py2.7.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/Users/yuhongchun/Library/Python/2.7/lib/python/site-packages', '/Library/Python/2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages/IPython/extensions', '/Users/yuhongchun/.ipython']
如果要添加额外的路径,我们应该如何操作呢?
可以用sys.path.append(),命令如下:
sys.path.append('/Users/yuhongchun/data/tmp')
如何从包中导入模块呢?例如要从包mypack中导入模块my1、my2和my3模块,那么可以用以下命令全部导入:
from mypack import * #定义使用 `*` 可以导入的对象
但是,如果mypack包的__init__.py文件有限制,要定义__all__的内容:
__all__ = ['my1','my2']
那么,上面的语句是不能够导入my3.py文件的。
另外,我们经常会在Python程序中看到下面这种用法:
if __name__ == '__main__': main()
这种用法究竟有什么意义呢?
__name__用于判断当前模块是否是程序的入口,如果当前程序正在被使用,__name__的值为__main__,则会主动执行此程序中的函数,否则说明被另外的模块调用了。