一个 .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 文件,提高速度。