板凳-------Mysql cookbook学习 (十二--------3)

第二章 抽象数据类型和python类
2.5类定义实例: 学校人事管理系统中的类

import datetimeclass PersonValueError(ValueError):"""自定义异常类"""passclass PersonTypeError(TypeError):"""自定义异常类"""passclass Person:_num = 0def __init__(self, name, sex, birthday, ident):if not (isinstance(name, str) andsex in ("女", "男")):raise PersonValueError(name, sex)try:birth = datetime.date(*birthday)except:raise PersonValueError("Wrong date:", birthday)self._name = nameself._sex = sexself._birthday = birthself._id = identPerson._num += 1def id(self): return self._iddef name(self): return self._namedef sex(self): return self._sexdef birthday(self): return self._birthdaydef age(self): return (datetime.date.today().year - self._birthday.year)def set_name(self, name):if not isinstance(name, str):raise PersonValueError("set_name", name)self._name = namedef __lt__(self, another):if not isinstance(another, Person):raise PersonTypeError(another)return self._id < another._id@classmethoddef num(cls): return Person._numdef __str__(self):return " ".join((self._id, self._name,self._sex, str(self._birthday)))def details(self):return ", ".join(("编号:" + self._id,"姓名:" + self._name,"性别:" + self._sex,"出生日期:" + str(self._birthday)))# 30人数据(包含你指定的p1)
p1 = Person("谢雨洁", "女", (2005, 7, 30), "25015101111")
p2 = Person("张伟", "男", (2002, 3, 15), "25015101112")
p3 = Person("李娜", "女", (2003, 9, 22), "25015101113")
p4 = Person("王芳", "女", (2004, 5, 18), "25015101114")
p5 = Person("刘强", "男", (2001, 11, 8), "25015101115")
p6 = Person("陈静", "女", (2005, 2, 14), "25015101116")
p7 = Person("杨光", "男", (2003, 7, 30), "25015101117")
p8 = Person("赵敏", "女", (2002, 12, 5), "25015101118")
p9 = Person("黄磊", "男", (2004, 8, 19), "25015101119")
p10 = Person("周涛", "男", (2001, 6, 25), "25015101120")
p11 = Person("吴秀英", "女", (2005, 4, 12), "25015101121")
p12 = Person("郑丽", "女", (2003, 10, 3), "25015101122")
p13 = Person("孙洋", "男", (2002, 1, 17), "25015101123")
p14 = Person("朱艳", "女", (2004, 7, 9), "25015101124")
p15 = Person("胡勇", "男", (2001, 9, 28), "25015101125")
p16 = Person("林军", "男", (2005, 3, 6), "25015101126")
p17 = Person("徐杰", "男", (2003, 11, 15), "25015101127")
p18 = Person("马兰", "女", (2002, 8, 22), "25015101128")
p19 = Person("高敏", "女", (2004, 2, 11), "25015101129")
p20 = Person("罗伟", "男", (2001, 5, 30), "25015101130")
p21 = Person("宋芳", "女", (2005, 10, 8), "25015101131")
p22 = Person("唐静", "女", (2003, 4, 19), "25015101132")
p23 = Person("董强", "男", (2002, 7, 3), "25015101133")
p24 = Person("袁丽", "女", (2004, 12, 25), "25015101134")
p25 = Person("邓洋", "男", (2001, 2, 14), "25015101135")
p26 = Person("曹艳", "女", (2005, 9, 7), "25015101136")
p27 = Person("彭勇", "男", (2003, 1, 20), "25015101137")
p28 = Person("潘军", "男", (2002, 6, 12), "25015101138")
p29 = Person("钟杰", "男", (2004, 11, 28), "25015101139")
p30 = Person("田兰", "女", (2001, 8, 15), "25015101140")# 人员列表
plist2 = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,p11, p12, p13, p14, p15, p16, p17, p18, p19, p20,p21, p22, p23, p24, p25, p26, p27, p28, p29, p30]# 打印所有人员信息
for i, p in enumerate(plist2, 1):print(f"{i:2d}. {p}")print("\nAfter sorting:")
plist2.sort()
for p in plist2:print(p.details())print("People created:", Person.num(), "\n")

#=================================================

# 30人数据(包含你指定的p1)
p1 = Person("谢雨洁", "女", (2005, 7, 30), "25015101111")
p2 = Person("张伟", "男", (2002, 3, 15), "25015101112")
p3 = Person("李娜", "女", (2003, 9, 22), "25015101113")
p4 = Person("王芳", "女", (2004, 5, 18), "25015101114")
p5 = Person("刘强", "男", (2001, 11, 8), "25015101115")
p6 = Person("陈静", "女", (2005, 2, 14), "25015101116")
p7 = Person("杨光", "男", (2003, 7, 30), "25015101117")
p8 = Person("赵敏", "女", (2002, 12, 5), "25015101118")
p9 = Person("黄磊", "男", (2004, 8, 19), "25015101119")
p10 = Person("周涛", "男", (2001, 6, 25), "25015101120")
p11 = Person("吴秀英", "女", (2005, 4, 12), "25015101121")
p12 = Person("郑丽", "女", (2003, 10, 3), "25015101122")
p13 = Person("孙洋", "男", (2002, 1, 17), "25015101123")
p14 = Person("朱艳", "女", (2004, 7, 9), "25015101124")
p15 = Person("胡勇", "男", (2001, 9, 28), "25015101125")
p16 = Person("林军", "男", (2005, 3, 6), "25015101126")
p17 = Person("徐杰", "男", (2003, 11, 15), "25015101127")
p18 = Person("马兰", "女", (2002, 8, 22), "25015101128")
p19 = Person("高敏", "女", (2004, 2, 11), "25015101129")
p20 = Person("罗伟", "男", (2001, 5, 30), "25015101130")
p21 = Person("宋芳", "女", (2005, 10, 8), "25015101131")
p22 = Person("唐静", "女", (2003, 4, 19), "25015101132")
p23 = Person("董强", "男", (2002, 7, 3), "25015101133")
p24 = Person("袁丽", "女", (2004, 12, 25), "25015101134")
p25 = Person("邓洋", "男", (2001, 2, 14), "25015101135")
p26 = Person("曹艳", "女", (2005, 9, 7), "25015101136")
p27 = Person("彭勇", "男", (2003, 1, 20), "25015101137")
p28 = Person("潘军", "男", (2002, 6, 12), "25015101138")
p29 = Person("钟杰", "男", (2004, 11, 28), "25015101139")
p30 = Person("田兰", "女", (2001, 8, 15), "25015101140")# 人员列表
plist2 = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,p11, p12, p13, p14, p15, p16, p17, p18, p19, p20,p21, p22, p23, p24, p25, p26, p27, p28, p29, p30]# 打印所有人员信息
for i, p in enumerate(plist2, 1):print(f"{i:2d}. {p}")print("\nAfter sorting:")
plist2.sort()
for p in plist2:print(p.details())print("People created:", Person.num(), "\n")

#=============================================

import datetime
from random import choice, randintclass Staff(Person):_id_num = 0# 部门分类teaching_depts = ["中文学院", "外文学院", "数学学院", "马克思学院"]support_depts = ["教务处", "学工处", "后勤处", "财务处", "保卫处"]departments = teaching_depts + support_depts# 职位和职称定义teaching_positions = ["教师", "班主任", "系主任", "教研室主任"]teaching_titles = ["助理教师", "讲师", "副教授", "教授", "政府津贴"]support_positions = ["科员", "主任", "处长", "院长"]admin_positions = ["专员", "主管", "经理", "总监"]all_positions = teaching_positions + support_positions + admin_positions@classmethoddef _id_gen(cls, birthday):"""生成员工ID: 类型码+年份后两位+部门代码+序号"""cls._id_num += 1birth_date = datetime.date(*birthday)year_code = str(birth_date.year)[-2:]# 部门代码取前两字的首字母dept_code = "".join([d[0] for d in cls.departments])[:2]# 类型码:T-教学单位,S-后勤单位dept = choice(cls.departments)type_code = "T" if dept in cls.teaching_depts else "S"return f"{type_code}{year_code}{dept_code}{cls._id_num:04d}"def __init__(self, name, sex, birthday, entry_date=None):# 生成员工IDstaff_id = self._id_gen(birthday)# 调用父类初始化super().__init__(name, sex, birthday, staff_id)# 设置入职日期(默认为今天)self._entry_date = entry_date if entry_date else datetime.date.today()self._salary = 0self._department = Noneself._position = Noneself._title = Noneself._type = Nonedef set_salary(self, amount):if not isinstance(amount, (int, float)) or amount < 0:raise ValueError("薪资必须为正数")self._salary = amountdef set_department(self, department):if department not in self.departments:raise ValueError(f"部门必须是以下之一: {self.departments}")self._department = department# 根据部门自动设置类型self._type = "教学单位" if department in self.teaching_depts else "后勤保障单位"def set_position(self, position):if position not in self.all_positions:raise ValueError(f"职位必须是以下之一: {self.all_positions}")self._position = positiondef set_title(self, title):"""设置职称(仅教学单位有效)"""if self._department in self.teaching_depts:if title not in self.teaching_titles:raise ValueError(f"教学职称必须是以下之一: {self.teaching_titles}")self._title = titleelse:self._title = "无"def details(self):base_info = super().details()return (f"{base_info}\n"f"单位类型: {self._type}\n"f"部门: {self._department}\n"f"职务: {self._position}\n"f"职称: {self._title}\n"f"薪资: {self._salary}\n"f"入职日期: {self._entry_date}")# 生成20个员工数据
def generate_staff(num=20):staff_list = []first_names = ["王", "李", "张", "刘", "陈", "杨", "赵", "黄", "周", "吴"]last_names = ["伟", "芳", "娜", "敏", "静", "丽", "强", "磊", "洋", "勇"]for _ in range(num):# 随机生成基本信息sex = choice(["男", "女"])name = choice(first_names) + choice(last_names)birth_year = randint(1980, 2000)birthday = (birth_year, randint(1, 12), randint(1, 28))# 创建员工实例staff = Staff(name, sex, birthday)# 设置部门(自动确定单位类型)dept = choice(Staff.departments)staff.set_department(dept)# 设置职务和职称if dept in Staff.teaching_depts:staff.set_position(choice(Staff.teaching_positions))staff.set_title(choice(Staff.teaching_titles))else:staff.set_position(choice(Staff.support_positions + Staff.admin_positions))staff.set_title("无")# 设置薪资if dept in Staff.teaching_depts:staff.set_salary(randint(8000, 50000))else:staff.set_salary(randint(3000, 30000))# 随机生成入职日期entry_date = datetime.date.today() - datetime.timedelta(days=randint(1, 1825))staff._entry_date = entry_datestaff_list.append(staff)return staff_list# 创建20名员工
staff_list = generate_staff(20)# 打印前5名员工信息
for i, staff in enumerate(staff_list[:5], 1):print(f"\n=== 员工{i} ===")print(staff.details())print(f"\n总员工数: {Staff._id_num}")

=== 员工1 ===
编号:S81中外0001, 姓名:黄强, 性别:男, 出生日期:1981-02-05
单位类型: 教学单位
部门: 数学学院
职务: 教研室主任
职称: 副教授
薪资: 32012
入职日期: 2024-01-14

=== 员工2 ===
编号:T90中外0002, 姓名:李敏, 性别:女, 出生日期:1990-10-03
单位类型: 后勤保障单位
部门: 教务处
职务: 院长
职称: 无
薪资: 17288
入职日期: 2022-08-27

=== 员工3 ===
编号:S99中外0003, 姓名:陈静, 性别:男, 出生日期:1999-07-22
单位类型: 后勤保障单位
部门: 教务处
职务: 总监
职称: 无
薪资: 20508
入职日期: 2024-12-04

=== 员工4 ===
编号:T91中外0004, 姓名:陈勇, 性别:男, 出生日期:1991-10-22
单位类型: 教学单位
部门: 中文学院
职务: 系主任
职称: 讲师
薪资: 31820
入职日期: 2023-11-03

=== 员工5 ===
编号:T96中外0005, 姓名:李敏, 性别:女, 出生日期:1996-03-16
单位类型: 教学单位
部门: 数学学院
职务: 教师
职称: 讲师
薪资: 34577
入职日期: 2025-02-26

总员工数: 20

class DepartmentCourses:"""各学院课程目录"""@staticmethoddef chinese_department():return {"学院名称": "中文学院","主修课程": [("现代汉语", "研究现代汉语的语音、词汇、语法等"),("古代汉语", "学习古代汉语的语法、文字、音韵及经典文献阅读"),("中国现代文学史", "探讨中国现代文学的发展历程和重要作品"),("中国当代文学史", "分析中国当代文学的现象、流派和代表作品"),("中国文学史", "全面介绍中国文学从古至今的发展脉络"),("语言学概论", "概述语言学的基本概念、理论和研究方法"),("文艺理论", "研究文学艺术的基本原理和批评方法"),("美学", "探讨美的本质、审美经验和艺术的价值"),("外国文学史", "了解世界文学的主要流派、作品及其影响")],"选修课程": [("写作", "提高文字表达能力和创作技巧"),("秘书学", "学习秘书工作的知识和技能,包括文书处理、档案管理等"),("英文常用写作", "提升英文写作能力和跨文化交流技巧"),("对外汉语教学概论", "了解对外汉语教学的基本原理和方法"),("中文办公自动化", "掌握中文环境下办公自动化软件的应用")]}@staticmethoddef math_department():return {"学院名称": "数学学院","主修课程": [("数学分析", "研究极限、微积分、级数等基本概念和方法"),("高等代数", "学习线性代数、矩阵论和抽象代数基础"),("解析几何", "研究几何图形的坐标表示和代数方法"),("概率论与数理统计", "掌握随机现象和数据分析的基本理论"),("常微分方程", "学习常微分方程的基本解法及应用"),("复变函数", "研究复数域上的函数理论"),("实变函数", "深入理解实数集和可测函数理论"),("抽象代数", "学习群、环、域等代数结构"),("拓扑学", "研究空间在连续变换下的不变性质")],"选修课程": [("数学建模", "学习用数学方法解决实际问题"),("数值分析", "掌握数值计算的基本算法"),("运筹学", "研究优化问题的数学方法"),("数学史", "了解数学发展历史和重要思想"),("计算机数学", "学习计算机科学中的数学基础")]}@staticmethoddef foreign_lang_department():return {"学院名称": "外文学院","主修课程": [("综合英语", "系统训练英语听、说、读、写能力"),("英语语言学", "研究英语语言的结构和规律"),("英美文学史", "学习英美文学发展历程和经典作品"),("翻译理论与实践", "掌握翻译的基本技巧和方法"),("跨文化交际", "研究不同文化背景下的交流策略"),("第二外语", "学习法语/德语/日语等第二外语基础"),("英语写作", "培养英语学术和实用写作能力"),("英语国家概况", "了解主要英语国家的文化和社会"),("学术英语", "掌握学术研究和论文写作的英语表达")],"选修课程": [("商务英语", "学习商务环境中的英语应用"),("英语演讲与辩论", "培养英语口头表达能力"),("影视英语", "通过影视作品学习地道英语"),("英语教学法", "了解英语作为外语的教学方法"),("同声传译基础", "初步掌握同声传译技巧")]}@staticmethoddef marxism_department():return {"学院名称": "马克思学院","主修课程": [("马克思主义基本原理", "系统学习马克思主义哲学、政治经济学和科学社会主义"),("中国近现代史纲要", "研究中国近现代历史发展脉络"),("毛泽东思想和中国特色社会主义理论体系概论", "学习党的理论创新成果"),("思想政治教育学原理", "研究思想政治教育的基本理论"),("马克思主义发展史", "了解马克思主义理论发展历程"),("科学社会主义理论与实践", "研究社会主义运动的历史和现实"),("马克思主义经典著作选读", "精读马克思主义经典文献"),("中国共产党历史", "学习党的奋斗历程和基本经验"),("当代世界经济与政治", "分析国际格局和热点问题")],"选修课程": [("中国特色社会主义理论与实践研究", "深入研究中国特色社会主义理论"),("马克思主义与社会科学方法论", "学习马克思主义研究方法"),("中国传统文化概论", "了解中国传统文化精髓"),("国际共产主义运动史", "研究国际共运的历史经验"),("当代社会思潮评析", "分析和评价当代主要社会思潮")]}@classmethoddef get_all_courses(cls):return {"中文学院": cls.chinese_department(),"数学学院": cls.math_department(),"外文学院": cls.foreign_lang_department(),"马克思学院": cls.marxism_department()}# 使用示例
if __name__ == "__main__":courses = DepartmentCourses.get_all_courses()# 打印中文学院课程print(f"=== {courses['中文学院']['学院名称']}课程 ===")print("\n主修课程:")for course, desc in courses['中文学院']['主修课程']:print(f"- {course}{desc}")print("\n选修课程:")for course, desc in courses['中文学院']['选修课程']:print(f"- {course}{desc}")

#================================================

import datetime
from random import choice, randint, random
from collections import defaultdict# ================== 基础类定义 ==================
class Person:def __init__(self, name, sex, birthday, ident):self.name = nameself.sex = sexself.birthday = datetime.date(*birthday)self.id = identclass Staff(Person):departments = ["中文学院", "外文学院", "数学学院", "马克思学院"]positions = ["讲师", "副教授", "教授", "研究员"]def __init__(self, name, sex, birthday, ident=None):ident = ident if ident else f"25015101{randint(100,999)}"super().__init__(name, sex, birthday, ident)self.department = choice(self.departments)self.position = choice(self.positions)self._type = "教学单位" if self.department.endswith("学院") else "行政单位"# ================== 课程管理系统 ==================
class Course:def __init__(self, name, description, credit, dept, category="主修"):self.name = nameself.description = descriptionself.credit = creditself.department = deptself.category = categoryself.popularity = 0self.students = set()self.assessments = {'平时作业': {'weight': 20, 'score': 0},'课堂表现': {'weight': 10, 'score': 0},'期中考试': {'weight': 20, 'score': 0},'实验报告': {'weight': 15, 'score': 0},'期末考试': {'weight': 35, 'score': 0}}def enroll(self, student_id):if student_id not in self.students:self.students.add(student_id)self.popularity = min(100, self.popularity + 5)return Truereturn Falsedef record_scores(self):"""为所有选课学生生成随机成绩"""for student_id in self.students:for item in self.assessments:self.assessments[item]['score'] = randint(60, 95)def calculate_final(self):"""计算最终成绩"""return sum(self.assessments[item]['score'] * self.assessments[item]['weight'] / 100 for item in self.assessments)# ================== 学院课程目录 ==================
department_courses = {"中文学院": {"主修": [("现代汉语", "语音、词汇、语法研究", 4),("古代汉语", "语法、文字、音韵研究", 4),("中国文学史", "文学发展脉络", 3)],"选修": [("创意写作", "文学创作技巧", 2),("古典文献学", "古籍整理与研究", 3)]},"数学学院": {"主修": [("高等数学", "微积分基础", 5),("线性代数", "矩阵与向量空间", 4),("概率统计", "随机现象分析", 3)],"选修": [("数学建模", "实际问题数学解决", 3),("数值分析", "数值计算方法", 3)]}
}# ================== 生成教职工数据 ==================
def generate_staff(num=30):first_names = ["王", "李", "张", "刘", "陈"]last_names = ["伟", "芳", "娜", "敏", "杰"]staff_list = []for i in range(num):name = choice(first_names) + choice(last_names)sex = choice(["男", "女"])birthday = (randint(1975, 1995), randint(1,12), randint(1,28))staff_list.append(Staff(name, sex, birthday, f"25015101{100+i}"))return staff_list# ================== 主系统 ==================
class AcademicSystem:def __init__(self):self.staff_list = generate_staff()self.courses = self.init_courses()self.student_records = {s.id: s for s in self.staff_list}self.course_records = defaultdict(dict)  # {student_id: {course: grade}}def init_courses(self):"""初始化所有课程"""courses = []for dept, categories in department_courses.items():for category, course_list in categories.items():for name, desc, credit in course_list:courses.append(Course(name, desc, credit, dept, category))return coursesdef enroll(self, student_id, course_name):"""学生选课"""student = self.student_records.get(student_id)course = next((c for c in self.courses if c.name == course_name), None)if student and course:if course.enroll(student_id):self.course_records[student_id][course] = Nonereturn Truereturn Falsedef generate_grades(self):"""为所有课程生成成绩"""for course in self.courses:course.record_scores()final_grade = course.calculate_final()for student_id in course.students:self.course_records[student_id][course] = {'grade': final_grade,'passed': final_grade >= 60,'credits': course.credit if final_grade >= 60 else 0}def get_transcript(self, student_id):"""生成成绩单"""if student_id not in self.student_records:return Nonestudent = self.student_records[student_id]records = self.course_records.get(student_id, {})transcript = {"学号": student_id,"姓名": student.name,"部门": student.department,"职位": student.position,"总学分": sum(cr['credits'] for cr in records.values() if cr),"课程成绩": [{"课程": course.name,"类型": course.category,"学分": course.credit,"成绩": record['grade'],"结果": "通过" if record['passed'] else "不通过"}for course, record in records.items()]}return transcript# ================== 使用示例 ==================
if __name__ == "__main__":system = AcademicSystem()# 选课示例system.enroll("25015101101", "现代汉语")system.enroll("25015101101", "高等数学")system.enroll("25015101102", "线性代数")# 生成成绩system.generate_grades()# 打印成绩单print("=== 学生成绩单示例 ===")print(system.get_transcript("25015101101"))# 打印热门课程print("\n=== 热门课程Top3 ===")popular = sorted(system.courses, key=lambda x: x.popularity, reverse=True)[:3]for i, course in enumerate(popular, 1):print(f"{i}. {course.name} ({course.department}, 热度: {course.popularity})")

=== 学生成绩单示例 ===
{‘学号’: ‘25015101101’, ‘姓名’: ‘刘敏’, ‘部门’: ‘数学学院’, ‘职位’: ‘教授’, ‘总学分’: 9, ‘课程成绩’: [{‘课程’: ‘现代汉语’, ‘类型’: ‘主修’, ‘学分’: 4, ‘成绩’: 74.3, ‘结果’: ‘通过’}, {‘课程’: ‘高等数学’, ‘类型’: ‘主修’, ‘学分’: 5, ‘成绩’: 86.15, ‘结果’: ‘通过’}]}

=== 热门课程Top3 ===

  1. 现代汉语 (中文学院, 热度: 5)
  2. 高等数学 (数学学院, 热度: 5)
  3. 线性代数 (数学学院, 热度: 5)
import datetime
from random import choice, randint, random
from collections import defaultdict# ================== 基础类定义 ==================
class Person:def __init__(self, name, sex, birthday, ident):self.name = nameself.sex = sexself.birthday = datetime.date(*birthday)self.id = identclass Student(Person):def __init__(self, name, sex, birthday, ident, degree_type):super().__init__(name, sex, birthday, ident)self.degree_type = degree_typeself.enrollment_date = datetime.date.today()self.courses = {}self.total_credits = 0self.gpa = 0.0def enroll_course(self, course):if course not in self.courses:self.courses[course] = Nonecourse.enroll(self.id)return Truereturn Falsedef update_grade(self, course, score):if course in self.courses:self.courses[course] = scoreself._update_academic_record()return Truereturn Falsedef _update_academic_record(self):"""更新学分和GPA"""total_points = 0total_credits = 0for course, score in self.courses.items():if score is not None and score >= 60:total_credits += course.credittotal_points += score * course.creditself.total_credits = total_creditsself.gpa = round(total_points / (total_credits * 25), 2) if total_credits > 0 else 0.0# ================== 派生学生类 ==================
class Undergraduate(Student):def __init__(self, name, sex, birthday, ident, major):super().__init__(name, sex, birthday, ident, "本科生")self.major = majorself.required_credits = 160  # 本科毕业要求学分def can_graduate(self):return self.total_credits >= self.required_creditsclass Master(Student):def __init__(self, name, sex, birthday, ident, research_field):super().__init__(name, sex, birthday, ident, "硕士生")self.research_field = research_fieldself.required_credits = 32self.thesis_progress = 0  # 论文进度(0-100)def update_thesis(self, progress):self.thesis_progress = min(100, self.thesis_progress + progress)def can_graduate(self):return (self.total_credits >= self.required_credits and self.thesis_progress >= 100)class PhD(Student):def __init__(self, name, sex, birthday, ident, research_topic):super().__init__(name, sex, birthday, ident, "博士生")self.research_topic = research_topicself.required_credits = 20self.papers_published = 0self.thesis_defended = Falsedef publish_paper(self):self.papers_published += 1def defend_thesis(self):self.thesis_defended = Truedef can_graduate(self):return (self.total_credits >= self.required_credits and self.papers_published >= 3 and self.thesis_defended)class InternationalStudent(Student):def __init__(self, name, sex, birthday, ident, degree_type, country):super().__init__(name, sex, birthday, ident, f"留学生({degree_type})")self.country = countryself.chinese_level = "HSK" + str(randint(3, 6))  # 随机汉语水平# 根据学位类型设置毕业要求if "本科" in degree_type:self.required_credits = 140elif "硕士" in degree_type:self.required_credits = 30else:self.required_credits = 18def can_graduate(self):return (self.total_credits >= self.required_credits and self.chinese_level >= "HSK4")# ================== 课程类 ==================
class Course:def __init__(self, name, credit, dept):self.name = nameself.credit = creditself.department = deptself.students = set()def enroll(self, student_id):self.students.add(student_id)return True# ================== 学院系统 ==================```python
class AcademicSystem:def __init__(self):self.students = {}self.courses = [Course("高等数学", 5, "数学学院"),Course("现代汉语", 4, "中文学院"),Course("机器学习", 3, "计算机学院")]def add_student(self, student_type, *args, **kwargs):"""添加学生"""if student_type == "本科":student = Undergraduate(*args, **kwargs)elif student_type == "硕士":student = Master(*args, **kwargs)elif student_type == "博士":student = PhD(*args, **kwargs)elif student_type == "留学":student = InternationalStudent(*args, **kwargs)else:raise ValueError("未知学生类型")self.students[student.id] = studentreturn studentdef enroll(self, student_id, course_name):"""学生选课"""student = self.students.get(student_id)course = next((c for c in self.courses if c.name == course_name), None)if student and course:return student.enroll_course(course)return Falsedef generate_grades(self):"""为所有学生生成随机成绩"""for student in self.students.values():for course in student.courses:if student.courses[course] is None:score = randint(50, 100) if random() > 0.1 else randint(30, 59)  # 10%不及格率student.update_grade(course, score)def check_graduation(self, student_id):"""检查毕业资格"""student = self.students.get(student_id)if student:return student.can_graduate()return False

================== 使用示例 ==================

if __name__ == "__main__":system = AcademicSystem()# 添加各类学生undergrad = system.add_student("本科", "张三", "男", (1999,5,12), "S2021001", "计算机科学")master = system.add_student("硕士", "李四", "女", (1995,8,23), "S2021002", "人工智能")phd = system.add_student("博士", "王五", "男", (1990,3,15), "S2021003", "量子计算")international = system.add_student("留学", "John Smith", "男", (1998,7,30), "S2021004", "本科", "美国")# 学生选课system.enroll(undergrad.id, "高等数学")system.enroll(undergrad.id, "机器学习")system.enroll(master.id, "机器学习")system.enroll(international.id, "现代汉语")# 生成成绩system.generate_grades()# 博士生发表论文phd.publish_paper()phd.publish_paper()phd.publish_paper()phd.defend_thesis()# 硕士生更新论文进度master.update_thesis(80)# 打印学生状态print("=== 学生状态 ===")for sid, student in system.students.items():status = "可毕业" if system.check_graduation(sid) else "在读"print(f"{student.name}({student.degree_type}): GPA={student.gpa}, 学分={student.total_credits}, 状态={status}")

=== 学生状态 ===
张三(本科生): GPA=3.31, 学分=8, 状态=在读
李四(硕士生): GPA=0.0, 学分=0, 状态=在读
王五(博士生): GPA=0.0, 学分=0, 状态=在读
John Smith(留学生(本科)): GPA=3.12, 学分=4, 状态=在读

一、系统框架设计
1. 核心模块2. 技术架构
┌─────────────────┐
│   前端展示层    │  # Vue/React + Element UI
├─────────────────┤
│   业务逻辑层    │  # Python(Django/Flask)
├─────────────────┤
│   数据访问层    │  # ORM(SQLAlchemy)
├─────────────────┤
│   数据存储层    │  # MySQL/PostgreSQL + Redis缓存二、系统分析
1. 角色分析
角色	权限说明	典型用例
教职工	查看个人信息/课表/薪资	请假申请/课表查询
院系管理员	管理本院系师生信息	教师考核/学生分班
人事专员	全系统人事数据管理	入职办理/离职处理
校级管理员	系统配置/权限分配	院系合并/权限调整
2. 关键业务流程
入职流程
简历筛选 → 面试安排 → 录用审批 → 信息录入 → 账号开通职称评审流程
个人申请 → 教研室初审 → 学院评审 → 学校终审 → 结果公示学生培养流程
培养方案制定 → 选课管理 → 中期考核 → 论文答辩 → 毕业审核三、系统配置方案
1. 基础配置
yaml
# config.yaml
database:host: mysql.university.eduport: 3306user: hr_systempassword: secure_passwordstorage:document_path: /var/www/hr_docsmax_upload_size: 100MBsecurity:password_policy:min_length: 8require_mixed_case: trueexpire_days: 90
2. 业务参数配置
python
# 职称晋升规则
PROMOTION_RULES = {"讲师→副教授": {"min_years": 5,"required_papers": 3,"teaching_hours": 320},"副教授→教授": {"min_years": 6,"required_projects": 2,"international_papers": 1}
}# 学分计算规则
CREDIT_POLICY = {"本科生": {"required": 160,"public_course_ratio": 0.3},"硕士生": {"core_course_min": 12,"thesis_credit": 8}
}
3. 集成配置
json
{"integrations": {"financial_system": {"api_endpoint": "https://finance.university.edu/api","sync_schedule": "daily 02:00"},"library_system": {"book_quota": {"professor": 20,"student": 10}}}
}
四、扩展设计
1. 数据模型设计
python
class Staff(models.Model):id = UUIDField(primary_key=True)name = CharField(max_length=50)type = ChoiceField(choices=[('TEACH', '教师'),('ADMIN', '行政'),('LAB', '实验员')])department = ForeignKey(Department)positions = ArrayField(  # 支持双肩挑人员EmbeddedField(PositionInfo))class Course(models.Model):code = CharField(max_length=10)  # 如"MATH-201"credits = DecimalField(max_digits=3, decimal_places=1)assessment_schema = JSONField()  # 存储考核权重
2. 安全设计
四层防护:网络层:IP白名单+VPN应用层:JWT认证+接口签名数据层:字段级加密(身份证/薪资)审计层:所有敏感操作留痕3. 高可用方案
plaintext┌───────────────┐│  负载均衡器   │└──────┬───────┘│┌──────────────┼──────────────┐▼              ▼              ▼
┌─────────────────────┐  ┌───────────────┐
│ 主数据库(MySQL集群)  │  │  只读副本     │
└─────────────────────┘  └───────────────┘▲│
┌──────────┴──────────┐
│   定时备份系统       │
│   (每日全量+binlog)  │
└─────────────────────┘

数据结构 与算法 裘宗燕 p65

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89796.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css flex 布局中 flex-direction为column,如何让子元素的宽度根据内容自动变化

在 display: flex 且 flex-direction: column 的布局中&#xff0c;默认情况下子元素会占满容器的宽度。要让子元素的宽度根据内容自适应&#xff0c;而不是自动拉伸填满父容器&#xff0c;你可以这样处理&#xff1a;✅ 解决方案一&#xff1a;设置子元素 align-self: start 或…

性能优化实践:Modbus 在高并发场景下的吞吐量提升(二)

四、Modbus 吞吐量提升实战策略4.1 优化网络配置选择合适的网络硬件是提升 Modbus 通信性能的基础。在工业现场&#xff0c;应优先选用高性能的工业级交换机和路由器。工业级交换机具备更好的抗干扰能力和稳定性&#xff0c;其背板带宽和包转发率更高&#xff0c;能够满足高并发…

上传ipa到appstore的几种工具

无论是用原生开发也好&#xff0c;使用uniapp或flutter开发也好&#xff0c;最好打包好的APP是需要上架appstore的。而在app store connect上架的时候&#xff0c;需要上传ipa文件到app store的构建版本上。因此&#xff0c;需要上传工具。下面分析下几种上传工具的优缺点&…

数控调压BUCK电路 —— 基于TPS56637(TI)

0 前言 本文基于 TI 的 TPS56637 实现一个支持调压的 BUCK 电路&#xff0c;包含从零开始详细的 原理解析、原理图、PCB 及 实测数据 本文属于《DIY迷你数控电源》系列&#xff0c;本系列我们一起实现一个简单的迷你数控电源 我是 LNY&#xff0c;一个在对嵌入式的所有都感兴…

prometheus UI 和node_exporter节点图形化Grafana

prometheus UI 和node_exporter节点图形化Grafana 先简单的安装一下 进行时间的同步操作安装Prometheus之前必须要先安装ntp时间同步&#xff0c;因为prometheus server对系统时间的准确性要求很高&#xff0c;必须保证本机时间实时同步。# 用crontab进行定时的时间的同步 yum …

RabbitMQ—TTL、死信队列、延迟队列

上篇文章&#xff1a; RabbitMQ—消息可靠性保证https://blog.csdn.net/sniper_fandc/article/details/149311576?fromshareblogdetail&sharetypeblogdetail&sharerId149311576&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 TTL …

LVS 集群技术详解与实战部署

目录 引言 一、实验环境准备 二、理论基础&#xff1a;集群与 LVS 核心原理 2.1 集群与分布式 2.2 LVS 核心原理 LVS 的 4 种工作模式 LVS 调度算法 三、LVS 部署工具&#xff1a;ipvsadm 命令详解 四、实战案例&#xff1a;LVS 部署详解 案例 1&#xff1a;NAT 模式…

前端vue3获取excel二进制流在页面展示

excel二进制流在页面展示安装xlsx在页面中定义一个div来展示html数据定义二进制流请求接口拿到数据并展示安装xlsx npm install xlsx import * as XLSX from xlsx;在页面中定义一个div来展示html数据 <div class"file-input" id"file-input" v-html&qu…

android 信息验证动画效果

layout_check_pro <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/parent"android:layout_width"wrap_content"android:layout_…

【iOS】继承链

文章目录前言什么是继承链OC中的根类关于NSProxy关键作用1.方法查找与动态绑定2. 消息转发3. **类型判断与多态**继承链的底层实现元类的继承链总结前言 在objective-c中&#xff0c;继承链是类与类之间通过父类&#xff08;Superclass&#xff09;关系形成的一层层继承结构&am…

论文阅读:Instruct BLIP (2023.5)

文章目录InstructBLIP&#xff1a;迈向通用视觉语言模型的指令微调研究总结一、研究背景与目标二、核心方法数据构建与划分模型架构训练策略三、实验结果零样本性能消融实验下游任务微调定性分析可视化结果展示四、结论与贡献InstructBLIP&#xff1a;迈向通用视觉语言模型的指…

Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】

目录 一、准备阶段 二、实验阶段 1.配置kibana主机 2.配置elasticsearch主机 3.配置logstash主机 4.配置/etc/filebeat/filebeat.yml 三、验证 1.开启Filebeat 2.在logstash查看 3.浏览器访问kibana 一、准备阶段 1.准备四台主机kibana、es、logstash、filebeat 2.在…

Vue开发前端报错:‘vue-cli-service‘ 不是内部或外部命令解决方案

1.Bug: 最近调试一个现有的Vue前端代码&#xff0c;发现如下错误&#xff1a; vue-cli-service’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 2.Bug原因&#xff1a; 导入的工程缺少依赖包&#xff1a;即缺少node_modules文件夹 3.解决方案&#xff1…

AI生态,钉钉再「出招」

如果说之前钉钉的AI生态加持更多的围绕资源和商业的底层助力&#xff0c;那么如今这种加持则是向更深层次进化&#xff0c;即真正的AI模型训练能力加持&#xff0c;为垂类大模型创业者提供全方位的助力&#xff0c;提高创业成功率和模型产品商业化确定性。作者|皮爷出品|产业家…

XSS GAME靶场

要求用户不参与&#xff0c;触发alert(1337) 目录 Ma Spaghet! Jefff Ugandan Knuckles Ricardo Milos Ah Thats Hawt Ligma Mafia Ok, Boomer Exmaple 1 - Create Example 2 - Overwrite Example 3 - Overwrite2 toString Ma Spaghet! <h2 id"spaghet&qu…

Unity学习笔记(五)——3DRPG游戏(2)

添加更多的敌人 编辑EnemyController&#xff0c;解决报错导致敌人无法注册观察者模式&#xff0c;从而无法执行敌人庆祝动画 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public enum EnemyStatus { GUARD,PATROL…

2025测绘程序设计国赛实战:一轮终章 | 单向后方交会C#实现

前言本文是小编对六道国赛试题中的最后一个试题&#xff0c;单向后方交会的一篇学习日志。本文的整体架构&#xff0c;依旧首先拿训练数据跟大家介绍本题涉及到的数据的属性含义&#xff0c;涉及到算法的原理、执行流程和终极目的。然后附上小编用C#来实现的程序&#xff0c;从…

基于Echarts的气象数据可视化网站系统的设计与实现(Python版)

本系统旨在构建一个基于Echarts的气象数据可视化系统&#xff0c;本系统能够从中国天气网爬取实时天气数据&#xff0c;并进行存储、分析和可视化展示。用户可以通过网页界面查看不同地区的天气情况&#xff0c;以及历史天气数据的变化趋势。 技术栈&#xff1a;Python语言、My…

HarmonyOS 启动提速秘籍:懒加载全链路实战解析

摘要 随着移动应用功能越来越复杂、界面越来越丰富&#xff0c;应用启动慢、内存占用高等问题也越来越普遍。特别是在 HarmonyOS NEXT 应用开发中&#xff0c;如果不加优化&#xff0c;用户打开页面时可能要等好几秒&#xff0c;体验就很差了。 懒加载&#xff08;Lazy Loading…

全新安装Proxmox VE启动时卡在Loading initial ramdisk

原因&#xff1a; 使用了Ventoy启动盘装载 Proxmox ISO 文件安装。 要用Ventoy优盘启动&#xff0c;选择Advance Option里的Rescue Boot&#xff0c; 修改文件/etc/default/grub.d/installer.cfg&#xff0c;删除rdinit/vtoy/vtoy运行 update-grub 更新grub配置&#xff0c;重启…