【发布时间】:2022-01-02 00:55:54
【问题描述】:
我有一个任务,我必须为员工创建一个类,读取包含要存储为对象的员工信息的文本文件,读取工作时间文件并从文件中创建付款信息字典.因此,到目前为止,只要他们只是员工文本文件中的一名员工,它似乎就可以正常工作,但是一旦我包含第二个,第一个就会被覆盖,而第二个的信息就是创建的内容。这是我目前掌握的一些信息:
class Staff:
staffData = {}
def __init__(self, EmpID, LName, FName, RHours, HRate, OTMult, TaxC, SBand, Date, HrsWorked):
self.EmpID = EmpID
self.LName = LName
self.FName = FName
self.RHours = RHours
self.HRate = HRate
self.OTMult = OTMult
self.TaxC = TaxC
self.SBand = SBand
self.Date = Date
self.HrsWorked = HrsWorked
Staff.staffData[EmpID] = self
def setup(staff ,hrs): # staff and hrs are text files
with open(staff) as empFile:
for line in empFile:
SID, LN, FN, RH, HR, OTM, TC, SB = line.split()
with open(hrs) as hFile:
for line in hFile:
SID, date, HrsWorked = line.split()
stf = Staff(SID, LN, FN, int(RH), int(HR), float(OTM), int(TC), int(SB),date, HrsWorked)
return stf
def paySlip(self,HrsWorked, date):
paymentDict = {}
#creates paySlip using information from instance and creates others by performing
calculations
return paymentDict
jg = Staff.setup('Staff.txt', 'Hrs.txt')
dic = jg.paySlip(42,'31/10/2021')
print(dic)
这是我目前所拥有的,它返回正确的输出,但是当我包含第二行和第二个工作人员时,这就是我遇到问题的地方。另外,请注意,paySlip 的参数必须是来自小时文本文件的日期和工作时间,而不仅仅是文本文件。我对编程很陌生,所以如果这是一个基本的修复,我很抱歉,我在过去的 3 天里试图通过访问不同的板和网站来解决这个问题。任何帮助将不胜感激。
【问题讨论】:
-
Staff.staffData[EmpID] = self将覆盖类变量。你想要self.staffData[EmpID]。用setup实例化类,然后让setup返回该类的实例也可能是不明智的。 -
staffData似乎是Staff实例的集合。问题是setup过早返回,并没有使用empFile的每一行,只使用最后一行。 -
感谢@match 的输入,当我做出您推荐的更改时,它返回了此错误。我猜它所指的 '12345' 是第一个员工的 EmpID: Traceback(最近一次通话最后一次):第 69 行,在
jg = Staff.setup('Staff.txt', 'Hrs.txt ') ,第 24 行,在设置中 stf = Staff(SID, LN, FN, int(RH), int(HR), float(OTM), int(TC), int(SB),date, HrsWorked) 第 15 行,在 init self.staffData[EmpID] KeyError: '12345' -
@chepner 感谢您的反馈,我不是 100% 能理解。我可以做些什么来纠正这个问题?
-
@chepner 我想我明白你的意思。设置读取 EmpFile 的最后一行并返回那里的任何信息,但我不明白为什么我的代码会这样做。是否需要先找到一种方法将 Emp 文件中的行拆分并单独存储,然后拆分这些行以将信息输入到类实例中?
标签: python file class dictionary object