ai agent(智能体)开发 python基础5 实现复杂项目的模块化管理
我们以 学生 成绩 科目 为三个class 为列子,讲解一下 模块之间的调用当需要将不同类分布在多个目录中时,可以通过 模块化目录结构 和 相对导入/绝对导入 实现跨目录调用。以下是详细的分步示例:
·
我们以 学生 成绩 科目 为三个class 为列子,讲解一下 模块之间的调用
当需要将不同类分布在多个目录中时,可以通过 模块化目录结构 和 相对导入/绝对导入 实现跨目录调用。以下是详细的分步示例:
1. 项目目录结构
假设项目结构如下(注意每个目录需要包含 __init__.py 文件以标识为 Python 包):
my_project/
│
├── main.py # 主程序入口
│
├── models/ # 存放数据模型类
│ ├── __init__.py
│ └── student.py # Student 类
│
├── services/ # 存放业务逻辑类
│ ├── __init__.py
│ └── score.py # Score 类
│
└── data/ # 存放基础数据类
├── __init__.py
└── subject.py # Subject 类
2. 类代码实现
(1) models/student.py
# 学生类:管理学生信息
class Student:
def __init__(self, student_id, name):
self.student_id = student_id
self.name = name
def __repr__(self):
return f"学生(ID: {self.student_id}, 姓名: {self.name})"
(2) data/subject.py
# 科目类:管理科目信息
class Subject:
def __init__(self, subject_id, name):
self.subject_id = subject_id
self.name = name
def __repr__(self):
return f"科目(ID: {self.subject_id}, 名称: {self.name})"
(3) services/score.py
# 成绩类:依赖 Student 和 Subject
from ..models.student import Student # 绝对导入:从上级目录的 models 导入 Student
from ..data.subject import Subject # 绝对导入:从上级目录的 data 导入 Subject
class Score:
def __init__(self, student: Student, subject: Subject, score: float):
self.student = student
self.subject = subject
self.score = score
def show_info(self):
print(f"{self.student.name} 的 {self.subject.name} 成绩为:{self.score}")
3. 主程序调用 (main.py)
# 绝对导入:从不同目录导入类
from models.student import Student
from data.subject import Subject
from services.score import Score
def main():
# 创建学生和科目对象
student = Student("S001", "张三")
math = Subject("M001", "高等数学")
# 创建成绩对象
score = Score(student, math, 90)
score.show_info()
if __name__ == "__main__":
main()
4. 运行结果
张三 的 高等数学 成绩为:90
关键点解析
1. 目录结构与导入方式
- 绝对导入:从项目根目录出发,使用完整路径导入(如
from models.student import Student)。 - 相对导入:在包内部使用(如
from ..models.student import Student),需注意相对路径层级。
2. __init__.py 的作用
- 将目录标记为 Python 包,允许模块导入。
- 可以是空文件,或定义包的初始化逻辑(如导出公共接口)。
3. 解决导入错误
- 错误示例:
ModuleNotFoundError: No module named 'models'- 原因:Python 未识别项目根目录为搜索路径。
- 解决:在运行前将项目根目录添加到
sys.path(或通过 IDE 配置)。
5. 扩展:动态路径处理
如果直接运行 main.py 时出现路径问题,可以动态添加项目根目录到 Python 路径:
# main.py 顶部添加以下代码
import sys
from pathlib import Path
# 获取当前文件的父目录的父目录(即项目根目录)
project_root = Path(__file__).parent.parent
sys.path.append(str(project_root))
# 然后正常导入
from models.student import Student
from data.subject import Subject
from services.score import Score
总结
| 步骤 | 操作 |
|---|---|
| 目录结构 | 按功能划分目录,添加 __init__.py |
| 类定义 | 在对应目录的模块中编写类代码 |
| 跨目录导入 | 使用绝对导入或相对导入 |
| 路径配置 | 确保 Python 能识别项目根目录 |
通过合理组织目录和导入逻辑,可以实现复杂项目的模块化管理!
更多推荐


所有评论(0)