Python Staff类读取多员工数据时实例被覆盖问题求助
问题原因分析
- 员工文件读取逻辑错误:遍历员工文件的for循环没有做数据存储动作,循环结束后
SID、LN、FN等变量仅保留最后一条员工的信息,前面的所有员工数据都被覆盖 - 工时文件读取逻辑提前终止:遍历工时文件时第一次创建Staff实例就直接return,仅会返回第一条处理的员工数据
- 类设计混淆了固定属性和动态参数:员工固定信息(工号、姓名、基础薪资参数等)和每次计算工资的动态参数(工时、日期)都放在
__init__中,每次算工资都重复创建员工实例,不符合类设计逻辑
修正后代码
class Staff: # 类属性存储所有员工的固定信息,key为员工ID staffData = {} def __init__(self, EmpID, LName, FName, RHours, HRate, OTMult, TaxC, SBand): # __init__仅存储员工固定属性,不要放动态的工时、日期 self.EmpID = EmpID self.LName = LName self.FName = FName self.RHours = RHours self.HRate = HRate self.OTMult = OTMult self.TaxC = TaxC self.SBand = SBand Staff.staffData[EmpID] = self @classmethod def setup(cls, staff_file, hrs_file): # 第一步:先加载所有员工的固定信息到staffData with open(staff_file, encoding='utf-8') as empFile: for line in empFile: line = line.strip() if not line: continue SID, LN, FN, RH, HR, OTM, TC, SB = line.split() # 直接创建员工实例存入类属性 cls(SID, LN, FN, int(RH), int(HR), float(OTM), int(TC), int(SB)) # 第二步:读取工时文件,返回所有员工的工时数据列表 hrs_records = [] with open(hrs_file, encoding='utf-8') as hFile: for line in hFile: line = line.strip() if not line: continue SID, date, HrsWorked = line.split() hrs_records.append((SID, date, int(HrsWorked))) # 返回所有员工实例字典 + 工时记录,方便后续调用paySlip return cls.staffData, hrs_records def paySlip(self, HrsWorked, date): paymentDict = { "员工ID": self.EmpID, "姓名": f"{self.FName} {self.LName}", "日期": date, "工时": HrsWorked, "基础薪资": min(HrsWorked, self.RHours)*self.HRate, "加班薪资": max(0, HrsWorked-self.RHours)*self.HRate*self.OTMult, # 个税、社保计算逻辑可自行补全 } return paymentDict # 调用示例 if __name__ == '__main__': # 加载所有员工和工时数据 all_staff, all_hrs = Staff.setup('Staff.txt', 'Hrs.txt') # 遍历所有工时记录生成工资单 for sid, date, hrs in all_hrs: # 从员工字典中取对应员工实例 staff = all_staff.get(sid) if not staff: print(f"未找到ID为{sid}的员工信息") continue # 调用paySlip生成工资单 pay_dict = staff.paySlip(hrs, date) print(pay_dict)
补充说明
- 修正后先预加载全部员工信息,处理工时数据时根据员工ID匹配对应实例,不会出现数据覆盖问题
- paySlip方法符合要求,仅传入工时和日期参数,不需要传入工时文件
- 如果需要单独查询某个员工某一天的工资单,直接调用
all_staff[员工ID].paySlip(工时, 日期)即可
内容的提问来源于stack exchange,提问作者HelpNeeded
相关产品推荐
相关产品推荐

