如何在Python中让Teacher类修改Student类的考勤属性并存储?
学生考勤系统实现方案
修正基础类的错误
原代码中super.__init__的调用方式有误,Python中调用父类构造函数应该用super().__init__(...),不需要传递self参数。
核心功能实现思路
- 给每个学生维护一份按日期存储的考勤记录,用字典结构,键为日期字符串(比如
'2024-09-01'),值为'present'或'absent'。 - 教师类负责管理学生列表,并提供批量记录单日考勤和导出考勤到文件的功能。
完整实现代码
class Person(): def __init__(self, first_name, last_name, date_of_birth, national_id, living_area, email): self.first_name = first_name self.last_name = last_name self.date_of_birth = date_of_birth self.national_id = national_id self.living_area = living_area self.email = email class Teacher(Person): def __init__(self, first_name, last_name, date_of_birth, national_id, living_area, email, work_experience, salary): super().__init__(first_name, last_name, date_of_birth, national_id, living_area, email) self.work_experience = work_experience self.salary = salary self.students = [] # 教师负责管理的学生列表 def add_student(self, student): """添加学生到管理列表""" if isinstance(student, Student): self.students.append(student) def take_daily_attendance(self, date, attendance_statuses): """ 记录单日考勤 :param date: 日期字符串,如'2024-09-01' :param attendance_statuses: 字典,键为Student对象,值为'present'/'absent' """ for student, status in attendance_statuses.items(): if student in self.students and status in ('present', 'absent'): student.attendance_records[date] = status def export_attendance_to_file(self, filename): """将所有学生的考勤记录导出到txt文件""" with open(filename, 'w', encoding='utf-8') as f: # 先写表头:姓名 + 所有日期 if self.students and self.students[0].attendance_records: dates = sorted(self.students[0].attendance_records.keys()) f.write(f"学生姓名\t{'\t'.join(dates)}\n") # 遍历每个学生写入考勤 for student in self.students: full_name = f"{student.first_name} {student.last_name}" attendance_values = [student.attendance_records.get(date, '未记录') for date in dates] f.write(f"{full_name}\t{'\t'.join(attendance_values)}\n") else: f.write("暂无考勤记录\n") class Student(Person): def __init__(self, first_name, last_name, date_of_birth, national_id, living_area, email, grade): super().__init__(first_name, last_name, date_of_birth, national_id, living_area, email) self.grade = grade self.attendance_records = {} # 存储考勤:{日期: 状态} # 使用示例 if __name__ == "__main__": # 创建教师 teacher = Teacher("Li", "Ming", "1985-05-10", "110101198505101234", "Beijing", "liming@school.com", 10, 8000) # 创建学生 student1 = Student("Zhang", "San", "2010-03-15", "110101201003154321", "Beijing", "zhangsan@school.com", 7) student2 = Student("Wang", "Wu", "2010-06-20", "110101201006201234", "Beijing", "wangwu@school.com", 7) # 添加学生到教师管理列表 teacher.add_student(student1) teacher.add_student(student2) # 记录9月1日考勤 teacher.take_daily_attendance('2024-09-01', {student1: 'present', student2: 'absent'}) # 记录9月2日考勤 teacher.take_daily_attendance('2024-09-02', {student1: 'absent', student2: 'present'}) # 导出到文件 teacher.export_attendance_to_file('attendance_records.txt')
代码说明
- Student类:新增
attendance_records字典,专门存储该学生每天的考勤状态。 - Teacher类:
- 新增
students列表,用于管理负责的学生。 add_student方法:添加学生到管理列表,确保只有Student对象能被添加。take_daily_attendance方法:接收日期和当天的考勤状态字典,批量给学生标记当天的考勤,同时做合法性检查(学生必须在教师的管理列表中,状态只能是指定值)。export_attendance_to_file方法:将所有学生的考勤按表格形式写入txt文件,先写日期表头,再逐行写入每个学生的姓名和对应日期的考勤状态。
- 新增
- 使用示例:演示了创建师生、添加学生、记录多日考勤、导出文件的完整流程。
内容的提问来源于stack exchange,提问作者Mfighter29
相关产品推荐
相关产品推荐

