【问题标题】:Python class instance most recent overwriting all othersPython 类实例最近覆盖所有其他实例
【发布时间】: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


【解决方案1】:

线

return stf

无论如何,在读取第一行后从设置功能返回。如果要将所有行存储在 Staff 对象列表中,则需要构建该列表,然后将其返回。类似的东西

        with open(hrs) as hFile:
            stf = []
            for line in hFile:
                SID, date, HrsWorked = line.split()
                stf.append(Staff(SID, LN, FN, int(RH), int(HR), float(OTM), int(TC), int(SB),date, HrsWorked))
            return stf

那么你应该得到 hFile 中的所有行。也就是说,这种构建方式很奇怪。您构建一个人员对象来提供人员对象列表?

您可能想将代码重组为 Staff 类和 StaffMember 类?这样,您就有了一个 Staff 对象,该对象包含有小时数的成员。但是我在这里可能是错的,因为我没有看到完整的图片

干杯

马库斯

【讨论】:

  • 感谢您的推荐,我按照您提到的做了,并在读取文件并附加到 stf 列表之前创建了一个空的 stf 列表。但我收到以下错误:AttributeError:'list' object has no attribute 'paySlip'。此外,作业只要求创建一个班级
  • 您现在有一个员工对象列表,因此您需要遍历列表并在每个对象上调用 paySlip。
猜你喜欢
  • 1970-01-01
  • 2012-09-27
  • 2018-01-07
  • 2019-09-24
  • 1970-01-01
  • 2014-09-19
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多