2017-04-18 101 views
1

我試圖編寫一個程序與子類。我一直在調試幾個小時,找不到解決方案。繼承和子類有一些問題

我需要編寫一個Employee類,保留Employee name和Employee number的數據屬性。接下來,我需要編寫一個名爲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' 

這裏是我的ValidationFile:

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 

這裏是我的EmployeeFile:

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) 

這裏是我的主file:

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) 
+0

一個解決方案可能會像'高清__init __ kwargs( self,name = None,number = None,shift = None,rate = None,hours = None):''另外你必須調用構造函數,如:'EmployeeFile.ProductionWorker('name',123,'shift here', 7.25,30)'......也許將這些值保存在一個臨時的地方,然後調用構造函數? – jmunsch

回答

0

你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()作爲適當的方法來調用父類初始化。

0

你打電話給你的構造函數在你的程序,因爲你已經宣佈在初始化幾個變量方法:

主程序

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