简单模块化

  1. 把函数、类、常量拆分到不同的文件,但放置在同一个文件夹
  2. 使用 from your_file import function_name, class_name 的方式进行调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ tree
.
├── main.py
└── utils.py

$ cat utils.py
def get_sum(a, b):
return a + b

$ cat main.py
from utils import get_sum

print(get_sum(1, 2)) # 3

$ python main.py
3

项目模块化

  1. 相对的绝对路径 - 从项目的根目录开始追溯
  2. 所有的模块调用,都要通过项目根目录import

image-20241030233425019

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ tree
.
├── proto
│   └── mat.py
├── src
│   └── main.py
└── utils
└── mat_mul.py

$ cd src/

$ python main.py
Traceback (most recent call last):
File "/Users/zhongmingmao/workspace/python/python-101/src/main.py", line 3, in <module>
from proto.mat import Matrix
ModuleNotFoundError: No module named 'proto'

Python 解释器在遇到 import 时,会在一个特定的列表中寻找模块 - sys.path

  1. Python 可以通过 Virtualenv 创建一个全新的 Python 运行环境
  2. 对于每个项目,最好有一个独立的运行环境来保持模块的纯净性

Main

Python 是脚本语言,不需要显式提供 main() 函数入口

  1. import 在导入文件时,会自动把所有暴露在外面的代码全部执行一遍
  2. __name__ 是 Python 的魔术内置参数,本质上模块对象的一个属性
    • 使用 import A 语句时,__name__ 会被赋值为 A 的名字,自然就不等于 __main__

使用 if __name__ == '__main__' 避免被 import 时执行,但又能单独执行

image-20241031000620502

image-20241031000758987