Python模块与包详解

Python模块与包详解


作者:朱之光


0. 模块本质
模块也是一个基本的.py文件。可以放入变量定义、函数定义。也可以放入语句。
解释器在加载脚本的时候,就是相当于解释执行了一下整个文件。

一个模块加载后在内存中只有一个实例。

如果一个.py文件是以模块加载方式被解释器执行的话,其__name__就是文件名中".py"之前的部分。
如果一个.py文件是以script方式被解释器执行的话,其__name__为"__main__"


1. The Module Search Path

当执行import module1;时,解释器会根据下面的搜索路径,搜索module1.py文件。
1) 当前工作目录
2) PYTHONPATH中的目录
3) Python安装目录 (/usr/local/lib/python)

事实上,模块搜索是在保存在sys.path这个全局变量中的目录列表中进行搜索。
sys.path会在解释器开始执行时被初始化成包含:
1)当前工作目录
2) PYTHONPATH中的目录
3) Python安装目录 (/usr/local/lib/python)

可以对sys.path进行修改。


2. Import Symbols of Module

有三种方法来导入模块中的符号
1) import module_name1;
module_name1中的所有符号将可以被访问,但是必须加上"module_name1."作为限定符。

module_name1.func1();
print module_name1.__name__;

2) from module_name1 import symbol1, symbol2
module_name1中的symbol1, symbol2将可以被直接访问,无需限定符。使用起来就像在当前script中定义一样。

symbol1();
print symbol2;

3) from module_name1 import *
module_name1中的所有符号将可以被直接访问。使用起来就像在当前script中定义一样。

symbol1();
print symbol2;


3. 编译模块

.pyc文件是.py文件的编译结果。

当解释器搜索到一个module1.py文件时,如果当前目录不存在一个module1.pyc文件,就会对.py文件进行编译。
将编译结果byte-code保存为.pyc文件。
如果发现module1.pyc已经存在,那么会进行文件修改日期比较。根据需要生成最新版本的.pyc文件。

模块的编译不需要使用者额外的参与,由解释器自动完成。


补充:
如果解释器启用了-O或-OO执行选项,将编译生成优化后的byte-code结果,保存为.pyo文件。同时.pyc文件会在执行时被忽略。
如果解释器只找到了.pyc文件,解释器仍然可以继续加载执行。可以用于二进制文件发布。
还可以在程序中控制编译,参见模块compileall。


4. Standard Modules
Python的发布版本包含了一些标准库。
其中一部分甚至已经被编译到解释器内部。这样做仅仅是为了提高效率和方便性。

5. The dir() Function
dir()可以列出当前加载的模块
dir(module_name)还可以列出模块中的符号

6. Packages
Package是模块的集合

每一个Package的根目录下面有一个__init__.py 文件。当解释器发现目录下有这个文件时,他就会认为这个目录下包含了一个Package。

__init__.py可以是一个空文件。package以及他下属的sub-package的根目录都必须有一个__init__.py文件
__init__.py可以放入代码进行初始化的工作。
__init__.py可以取得package的__name__就是package的目录名。

Sound/ Top-level package
__init__.py Initialize the sound package
Formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
Effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
Filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...

访问方法类似Java,'.'被转换成'/'
import Sound.Effects.echo
Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)

from Sound.Effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)


from Sound.Effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)

7. Importing * From a Package

from Sound.Effects import *

__init__.py中有以下代码
__all__ = ["echo", "surround", "reverse"]

当对某个package执行import *时,将自动导入__all__中列出的模块名称或者是package名称。
如果__all__包含不存在的名称,会发生错误。
 

你可能感兴趣的:(Python模块与包详解)