6个月Python学习计划 Day 19 - 模块与包的实战拆分
🎯 今日目标
- 理解Python模块和包的概念
- 学会如何拆分大型程序为多个模块
- 掌握模块的导入和使用方法
- 了解包的结构和创建
- 简单封装工具函数模块
📚 核心概念
模块(Module):一个 .py
文件就是一个模块,里面可以定义函数、类、变量等。
包(Package):一个包含 init.py 文件的文件夹,即一个包,包里可以包含多个模块。
通过模块和包,可以把程序拆分成多个功能清晰、职责单一的部分。
🛠️ 拆分学生管理系统代码示例
-
创建文件结构
student_manager/ ├── main.py ├── student.py ├── manager.py └── utils.py
-
student.py — 学生类定义
# student.pyclass Student:def __init__(self, sid, name, score):self.sid = sidself.name = nameself.score = scoredef __str__(self):return f"{self.sid:<6} {self.name:<10} {self.score:<5}"def __eq__(self, other):if isinstance(other, Student):return self.sid == other.sidreturn False
-
manager.py — 管理类
# manager.pyfrom student import Studentclass StudentManager:def __init__(self):self.students = []def add_student(self, sid, name, score):self.students.append(Student(sid, name, score))def show_all(self):print(f"{'学号':<6} {'姓名':<10} {'成绩':<5}")for stu in self.students:print(stu)def find_by_sid(self, sid):for stu in self.students:if stu.sid == sid:print("找到学生:", stu)returnprint("未找到该学号的学生。")def delete_by_sid(self, sid):for stu in self.students:if stu.sid == sid:self.students.remove(stu)print("删除成功!")returnprint("删除失败,未找到该学号。")def sort_by_score(self):self.students.sort(key=lambda x: x.score, reverse=True)print("成绩排序成功!")self.show_all()def search_by_name(self, keyword):result = [stu for stu in self.students if keyword.lower() in stu.name.lower()]if result:print(f"{'学号':<6} {'姓名':<10} {'成绩':<5}")for stu in result:print(stu)else:print("未找到相关学生。")
-
utils.py — 工具函数(示例)
# utils.pydef input_score(prompt="请输入成绩:"):while True:try:score = float(input(prompt))return scoreexcept ValueError:print("输入无效,请输入数字。")
-
main.py — 程序入口
# main.pyfrom manager import StudentManager from utils import input_scoredef run():manager = StudentManager()while True:print("\n==== 学生成绩管理系统 ====")print("1. 添加学生")print("2. 显示所有学生")print("3. 查找学生")print("4. 删除学生")print("5. 按成绩排序")print("6. 退出")print("7. 按姓名模糊查找")choice = input("请输入操作编号:")if choice == "1":sid = input("请输入学号:")name = input("请输入姓名:")score = input_score()manager.add_student(sid, name, score)print("添加成功!")elif choice == "2":manager.show_all()elif choice == "3":sid = input("请输入要查找的学号:")manager.find_by_sid(sid)elif choice == "4":sid = input("请输入要删除的学号:")manager.delete_by_sid(sid)elif choice == "5":manager.sort_by_score()elif choice == "6":print("感谢使用,已退出。")breakelif choice == "7":keyword = input("请输入要查找的姓名关键词:")manager.search_by_name(keyword)else:print("输入无效,请重新输入。")if __name__ == "__main__":run()
📝 今日练习任务
-
将已有的“学生成绩管理系统”代码拆分成上述模块文件,实现模块导入运行。
-
新增一个工具函数
input_score
来校验成绩输入。 -
尝试为系统增加新模块,比如添加一个 file_manager.py 模块,来实现后续的文件保存与读取功能。
-
file_manager.py — 文件读写模块示例
# file_manager.py import os from student import StudentFILE_PATH = "students_data.txt"def save_students(students):"""将学生列表保存到文件,覆盖写入"""with open(FILE_PATH, "w", encoding="utf-8") as f:for stu in students:# 格式:学号|姓名|成绩line = f"{stu.sid}|{stu.name}|{stu.score}\n"f.write(line)def load_students():"""从文件读取学生数据,返回 Student 对象列表"""students = []if not os.path.exists(FILE_PATH):return studentswith open(FILE_PATH, "r", encoding="utf-8") as f:for line in f:line = line.strip()if not line:continuesid, name, score_str = line.split("|")try:score = float(score_str)except ValueError:score = 0.0students.append(Student(sid, name, score))return students
-
在 StudentManager 类中,可以增加两个方法:
from file_manager import save_students, load_studentsclass StudentManager:def __init__(self):# 加载时初始化学生列表self.students = load_students()# 其他方法...def save_to_file(self):save_students(self.students)print("数据已保存到文件。")
-
退出时保存
在 main.py 退出程序时调用:elif choice == "6":manager.save_to_file()print("感谢使用,数据已保存,程序退出。")break
-
🧾 今日总结
知识点 | 说明 |
---|---|
Python模块 | 单个 .py 文件即为模块 |
包(Package) | 带有 __init__.py 的文件夹 |
导入语法 | import 、from ... import ... |
拆分代码 | 方便维护、复用和多人协作 |