模块
- 模块是一个文件,包含可执行语句和函数。
- 文件名就是模块名加上
.py
后缀。 - 使用
import
导入模块,并且使用modelname.function
的方式调用模块中的方法。 - 模块中的可执行语句在第一次导入时执行。
- 每个模块都有自己私有符号表,模块内定义的所有函数用其作为全局符号表。因此,模块的作者可以在模块里使用全局变量,而不用担心与某个用户的全局变量有冲突。另一方面,如果你知道自己在做什么,你可以使用引用模块函数的表示法访问模块的全局变量,
modname.itemname
。 import
可以直接导入模块中的函数,而不会把模块名导入本地符合表中,有点类似Java的静态导入。
# 导入fib, fib2函数
from fibo import fib, fib2
# 导入模块内所有函数,不包含以`_`开头的函数。
from fibo import *
- 模块的名称可由全局变量
__name__
得到。
#可以让此文件既可以作为可执行的脚本,也可以当作可以导入的模块,因为解析命令行的那部分代码只有在模块作为 “main” 文件执行时才被调用。
#这种方法通常用来为模块提供一个方便的用户接口,或者用来测试(例如直接运行脚本会执行一组测试用例)
if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))
模块的执行路径
- 当导入一个模块时,首先搜索具有该名称的内置模块,如果没有找到就从
sys.path
目录下查找。sys.path
变量初始值来自:
- 脚本所在目录
PYTHONPATH
- 与安装相关的默认值
包
- 包是用来管理模块的。类似于Java的包。
- 包避免了模块之间的重名。
- 目录下包含
__init__.py
文件,才会被当作包
导入
# 从包中导入模块,使用时需加上完整名称
import sound.effects.echo
sound.effects.echo.echofilter()
# 同上,使用时不用包前缀
from sound.effects import echo
echo.echofilter()
## 直接导入所需函数或变量
from sound.effects.echo import echofilter
echofilter()
- 注意使用
from package import item
时,item
可以是包的子模块(或子包),也可以是包中定义的一些其它的名称,比如函数、 类或者变量。 - 使用类似
import item.subitem.subsubitem
这样的语法时,除了最后一项其它每项必须是一个包;最后一项可以是一个模块或一个包,但不能是在前一个项目中定义的类、函数或变量。 - 推荐写法:
from Package import specific_submodule
。 - 如果包中的
__init__.py
代码定义了一个名为__all__
的列表,那么在遇到from package import *
语句的时候,应该把这个列表中的所有模块名字导入。
包含多个目录的包
包还支持一个特殊的属性, path。在文件运行之前,该变量被初始化为一个包含 init.py 所在目录的列表。这个变量可以修改;这样做会影响未来包中包含的模块和子包的搜索。
虽然通常不需要此功能,它可以用于扩展包中的模块的集合。