第二章 抽象數據類型和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 ===
- 現代漢語 (中文學院, 熱度: 5)
- 高等數學 (數學學院, 熱度: 5)
- 線性代數 (數學學院, 熱度: 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