一个 .py
文件就是一个模块。每个模块都有自己的命名空间,模块名就是命名空间名。
使用命名空间可以防止变量名冲突,因为不同命名空间里定义的相同变量名不会发生冲突。
当前模块的命名空间:__main__
模块中的 类、函数、变量 等可以在其他模块中导入并使用。
导入模块的三种方法:
import pickle
。调用方法:pickle.dump()
。缺点:若模块名很长,写起来会比较麻烦from pickle import dump
。调用方法:dump()
。缺点:这种导入方法会将pickle
命名空间的dump
导入当前命名空间,如果当前命名空间也有一个叫dump
的变量,会发生命名冲突import pickle as p
。调用方法:p.dump()
。缺点:改变了模块名,他人维护困难
注意:这里的 pickle 要理解为命名空间名,而不是模块名,虽然命名空间名和模块名相同。
包是包含多个模块的一个目录。从包中导入模块:from package_name import module_name
包中需要添加一个 __init__.py
文件,Python 以此来确定该目录是一个包。
__init__.py
文件中可以不写任何代码,也可以写。__init__.py
文件会在包或包中的任何东西被导入时执行- 如果直接从包导入变量,如:
from package_name import var_name
,只能导入定义在__init__.py
文件中的变量。要导入包中其他文件中定义的变量,可以这样导入:from package_name.module_name import var_name
模块搜索路径:
- 导入模块或包时,Python 会在 模块搜索路径 中搜索要导入的模块。
sys.path
是一个列表,记录着所有的 模块搜索路径,越靠前的搜索路径优先级越高
从相对路径导包:
.
表示当前包..
表示上一级的包from . import module_name
表示从当前包导入module_name
模块。from ..main import module_name
表示从上一级目录的main
包导入module_name
模块。from .main.module_name import var_name
表示从当前目录的main
包的module_name
模块中导入var_name
。
模块被别的模块导入时,会在模块所在目录下产生一个 __pycache__
目录,里面存储模块转换成的 pyc 文件。
pyc 文件是 py 文件转换成的中间字节码文件,如果程序在下次运行前没有改变,则会运行 pyc 文件,提高速度。