【问题标题】:Having some trouble with inheritance and subclasses继承和子类有一些问题
【发布时间】:2017-04-19 07:32:10
【问题描述】:

我正在尝试编写带有子类的程序。我已经调试了几个小时,但找不到解决方案。

我需要编写一个员工类来保存员工姓名和员工编号的数据属性。接下来,我需要编写一个名为 ProductionWorker 的类,它是 Employee 类的子类。 ProductionWorker 类应保留班次编号、小时工资率和本周工作小时数的数据属性。工作日分为两班倒:白天和晚上。 shift 属性将保存一个整数值,表示员工工作的班次。白班是1,夜班是2。为每个类编写适当的访问器和修改器方法。

接下来,我需要创建一个 ProductionWorker 类的对象,并提示用户为该对象的每个数据属性输入数据。我使用数据验证类来确保用户输入有效的工资率和小时数。我将数据存储在对象中,然后使用对象的访问器方法检索它并将其显示在屏幕上。我还需要显示该工人本周的总工资。总工资=小时工资*工作时间。我无法对主文件进行任何计算。

接下来,我需要编写一个 ShiftSupervisor 类,它是 Employee 类的一个单独子类。如果轮班达到生产目标,轮班主管将获得薪水和年度奖金。 ShiftSupervisor 类应保留一个数据属性用于年薪和一个数据属性用于轮班主管获得的年度生产奖金。
我需要编写第二个程序,该程序将创建 ShiftSupervisor 类的对象并提示用户为每个对象的数据属性输入数据。我需要显示这位主管的年薪总额。

当我运行主文件时出现此错误:

        Traceback (most recent call last):
  File "/Users/Jeremy/Documents/Python Projects/Mosier_Jeremy_HW8/HW8MAIN.py", line 4, in <module>
    employeeObject = EmployeeFile.ProductionWorker ()
TypeError: __init__() missing 5 required positional arguments: 'name', 'number', 'shift', 'rate', and 'hours'

这是我的验证文件:

    class ValidationClass:

    def checkFloat (self, inputString):

        try:
            result = float (inputString)
        except Exception:
            return -1

        if result < 0:
            return -1
        else:
            return result

    def checkInteger (self, inputString):

        try:
            result = int (inputString)
        except Exception:
            return -1

        if result < 0:
            return -1
        else:
            return result

这是我的员工档案:

    class Employee ():
    def __init__(self, name, number):
        self.__Name = name
        self.__Number = number

    def set_Name (self, name):
        self.__Name = value

    def set_Number(self, number):
        self.__Number = value

    def get_Name (self):
        return self.__Name

    def get_Number (self):
        return self.__Number

class ProductionWorker (Employee):
    def __init__(self, name, number, shift, rate, hours):
        self.__Shift = shift
        self.__Rate = rate
        self.__Hours = hours
        Employee.__init__(self, name, number)

    def set_Shift (self, shift):
        self.__Shift = shift

    def set_PayRate (self, rate):
        self.__PayRate = rate

    def set_Hours (self, hours):
        self.__Hours = hours

    def get_Shift (self):
       if self.__Shift == 1:
            s = 'Day shift'
       elif self.__Shift == 2:
            s = 'Night shift'
       return s

    def get_PayRate (self):
        return self.__PayRate

    def get_Hours (self):
        return self.__Hours

    def get_Pay (self):
        return self.__Pay

    def calcPay (self):
        self.__Pay = (self.__PayRate) * (self.__Hours)

class ShiftSupervisor (Employee):
    def __init__ (self, name, number, salary, bonus):
        self.__Salary = salary
        self.__Bonus = bonus
        Employee.__init__ (self, name, number)

    def set_Salary (self, salary):
        return self.__Salary

    def set_Bonus (self, bonus):
        return self.__Bonus

    def get_Salary (self):
        self.__Salary = salary

    def get_Bonus (self):
        self.__Bonus = bonus

    def calcPay (self):
        self.__Pay = (self.__Salary) + (self.__Bonus)

这是我的主文件:

    import EmployeeFile
import ValidationFile

employeeObject = EmployeeFile.ProductionWorker ()
validationObject = ValidationFile.ValidationClass ()

employeeName = -1
while employeeName == -1:
    employeeName = input ('Please enter the employee name: ')
    if employeeName == '':
        print ('ERROR: Please enter a valid name.')
        employeeName = -1

employeeNumber = -1
while employeeNumber == -1:
    employeeNumber = input ('Please enter the employee name: ')
    if employeeNumber == '':
        print ('ERROR: Please enter a valid name.')
        employeeNumber = -1

shiftNumber = -1
while shiftNumber == -1:
    shiftNumber = input ('Please enter which shift the employee works. 1 for day shift, 2 for night shift: ')
    if shiftNumber < 1 or shiftNumber > 2:
        print ('ERROR: Shift number must be entered as a 1 or a 2.')

payRate = -1
while payRate == -1:
    payEntry = input ('Please enter which shift the employee works. 1 for day shift, 2 for night shift: ')
    payRate = validationObject.checkFloat (payEntry)
    if payRate == -1:
        print ('ERROR: Pleae enter a valid payRate.')

hours = -1
while hours == -1:
    hoursEntry = input ('Please enter which shift the employee works. 1 for day shift, 2 for night shift: ')
    payRate = validationObject.checkFloat (hoursEntry)
    if payRate == -1:
        print ('ERROR: Pleae enter a valid payRate.')

#populate inputs
employeeObject.set_Name (employeeName)
employeeObject.set_Number (employeeNumber)
employeeObject.set_Shift (shiftNumber)
employeeObject.set_PayRate (payRate)
employeeObject.set_Hours (hours)

print ('Employee name: ', employeeName)
print ('Employee number: ', employeeNumber)
print ('Shift: ', shiftNumber)
print ('Pay rate: ', payRate)
print ('Hours worked: ', hours)

【问题讨论】:

  • 一个解决方案可能是像def __init__(self, name=None, number=None, shift=None, rate=None, hours=None): 这样的kwargs,否则你必须调用构造函数,如:EmployeeFile.ProductionWorker ('name', 123, 'shift here', 7.25, 30) ...也许将值保存在一个临时位置然后调用构造函数?

标签: python inheritance


【解决方案1】:

您的 ProductionWorker 类要求您输入某些参数,这就是它抱怨的原因:

class ProductionWorker (Employee):
    def __init__(self, name, number, shift, rate, hours):
        self.__Shift = shift
        self.__Rate = rate
        self.__Hours = hours
        Employee.__init__(self, name, number)

在获得所有信息之前,您需要将这些设置为可选或不创建对象。我建议等到您获得所有信息,然后将您当前的填充输入替换为:

#populate inputs
employeeObject = EmployeeFile.ProductionWorker(employeeName, employeeNumber, shiftNumber, payRate, hours)

此外,您应该查看 super() 作为调用父类 init 的正确方法。

【讨论】:

    【解决方案2】:

    您必须在程序中调用构造函数,因为您在 init 方法中声明了多个变量:

    在主程序中:

    employeeObject = EmployeeFile.ProductionWorker("name", 12, 1, 10.0, 3)#random variable names used
    

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多