跳到主要内容

模块

1. 什么是模块

  • 代码越来越多时,单文件会变长、难维护;通常把函数按功能分组,放到不同文件,每个文件代码量更少。
  • 在 Python 中,一个 .py 文件就是一个模块(Module)
  • 例如:abc.py 是名为 abc 的模块,xyz.py 是名为 xyz 的模块。

2. 使用模块的好处

好处说明
可维护性代码分文件、分模块,结构清晰,易于维护
复用不必从零开始;可引用内置模块第三方模块,自己写的模块也可被别处引用
避免命名冲突相同名字的函数/变量可放在不同模块中,写模块时不必担心与其他模块冲突;但尽量不要与内置函数名冲突

3. 包(Package)

  • 若不同人写的模块名相同会冲突;Python 用按目录组织模块的方式避免冲突,称为包(Package)
  • 做法:选一个顶层包名(如 mycompany),把模块放在该目录下;只要顶层包名不与他人冲突,其下所有模块都不会冲突。

目录示例

mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py
  • 此时 abc.py 的模块名变为 mycompany.abcxyz.py 变为 mycompany.xyz

4. init.py

  • 每个包目录下必须有 __init__.py,否则 Python 会把该目录当作普通目录,而不是包。
  • __init__.py 可以是空文件,也可以写 Python 代码;__init__.py 本身也是一个模块,其模块名就是包名(如 mycompany)。

5. 多级包

  • 可以有多级目录,形成多级包结构。例如:
mycompany
├─ web
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ abc.py
└─ utils.py
  • www.py 的模块名是 mycompany.web.www
  • 两个 utils.py 的模块名分别是 mycompany.utilsmycompany.web.utils(不冲突)。
  • mycompany.web 也是一个模块,对应的是 mycompany/web/__init__.py

6. 命名注意

  • 不要与 Python 自带模块同名。例如系统有 sys 模块,自己的模块不要命名为 sys.py,否则无法导入系统自带的 sys
  • 模块名要符合 Python 变量命名规范,不要用中文、特殊字符。
  • 新建模块前可先检查是否与系统模块冲突:在交互环境执行 import 模块名,若成功则说明系统已有该模块,应换名。

小结

要点说明
模块一个 .py 文件即一个模块;用于分组代码、提高可维护性与复用
按目录组织模块,顶层包名不冲突则其下模块都不冲突;模块名变为 包名.模块名
init.py包目录下必须有,可为空;对应包名模块
命名不与系统模块冲突;符合变量命名规范;可先 import 模块名 检查

记忆:.py 文件 = 模块;目录 + init.py = 包;模块名别和内置撞车。