1.1.5 模块与包(Django 基础学习细节)
模块和包是 Python 项目组织和代码复用的基础。Django 项目本质上就是由多个模块和包组成。理解和灵活运用模块与包机制,是写好大型项目的关键。
一、import、from-import、as 的用法
1. import
-
用于导入整个模块,模块名为文件名(不带 .py)。
-
用法:
pythonimport math print(math.sqrt(16)) # 4.0
2. from ... import ...
-
用于从模块或包中导入指定成员(变量、函数、类等)。
-
用法:
pythonfrom math import sqrt, pi print(sqrt(9)) # 3.0 print(pi) # 3.141592653589793
3. as
-
用于给模块或成员起别名,简化书写或防止命名冲突。
-
用法:
pythonimport numpy as np from datetime import datetime as dt print(np.array([1, 2, 3])) now = dt.now()
4. 多层包导入
-
支持多级包结构:
pythonfrom myproject.utils.tools import my_func
二、name == "main"
1. 含义
- 每个 Python 文件都作为一个模块,模块有一个
__name__
属性。 - 如果模块被直接运行,
__name__ == "__main__"
;如果被导入,__name__
等于模块名。
2. 作用
- 只在脚本直接运行时执行某段代码,导入时不执行。
- 常用于编写测试代码、命令行入口。
3. 示例
python
# foo.py
def say_hi():
print("Hi!")
if __name__ == "__main__":
say_hi() # 直接运行 foo.py 时会执行
python
# bar.py
import foo # 导入 foo.py,不会执行 if __name__ == "__main__" 下的内容
三、sys.path
1. sys.path 的作用
- 是一个列表,包含所有 Python 查找模块的目录。
- 可动态添加搜索路径,方便跨目录导入。
2. 示例
python
import sys
print(sys.path)
sys.path.append("/path/to/my/modules")
# 现在可以 import 该目录下的模块
3. 应用场景
- 复杂项目/部署时临时添加自定义模块路径
- 避免命名冲突和导入错误
四、包的初始化(init.py)
1. 包的概念
- 包是包含多个模块的文件夹,必须包含一个
__init__.py
文件(可为空)。 __init__.py
的存在使 Python 将该目录识别为包。
2. init.py 的作用
- 初始化包(如导入常用模块、定义包级变量/函数等)
- 控制子模块的导出(通过 all)
- 可以写包级别的初始化逻辑
3. 示例结构
myproject/
├── __init__.py
├── foo.py
├── bar.py
python
# myproject/__init__.py
from .foo import say_hi
from .bar import some_func
- 导入包时自动执行
__init__.py
代码:
python
import myproject
myproject.say_hi()
4. all 控制包成员
python
# __init__.py
__all__ = ["foo", "bar"]
from myproject import *
时只导入foo
,bar
。
五、模块与包在 Django 项目中的应用
- 项目根目录即包(包含 manage.py、settings.py、urls.py 等模块)
- 每个 app 是独立包(含 models.py、views.py、admin.py、apps.py 等模块)
- 通常会在
__init__.py
中做初始化或暴露接口
六、实用小结
- 用 import/from-import/as 灵活组织和复用代码
- 用
__name__ == "__main__"
编写可测试或可复用模块 - sys.path 控制模块搜索路径,解决复杂项目的导入问题
__init__.py
是包的标识和初始化位置,建议始终保留即使为空