2017-04-18 35 views
1

我正在學習有關繼承和多態現在,此代碼應該測試這些概念。當我嘗試實例化子類對象時,init構造函數不能識別該方法。這是代碼。__init__方法異常 - NameError:名稱'setShiftNum'未定義

class Employee: 

    # constructor 
    def __init__(self, name, empnum): 
     self.__empName = name 
     self.__empNum = empnum 
     #setName(name) 
     #setNumber(empnum) 

    # setters 
    def setName(self, name): 
     self.__empName = name 

    def setNumber(self, number): 
     if len(str(number)) == 5: 
      self.__empNum = number 
     else: 
      print('Too many or too little numbers entered. Please try again') 
      setNumber() 

    # getters 
    def getName(self): 
     return self.__empName 

    def getNumber(self): 
     return self.__empNum 


class ProductionWorker(Employee): 

    # Overwritten constructor 
    def __init__(self, name, empnum, shiftnum, rate): 
     self.setShiftNum(shiftnum) 
     self.setPayRate(rate) 
     # Calls Superclass Method 
     Employee.__innit__(self, name, empnum) 

    # Setters 
    def setShiftNum(self, num): 
     if num == 1 | 2: 
      self.__shiftNum = num 
     else: 
      print('Shift number needs to be a 1 or 2. Please try again') 
      setShiftNum(self, num) 

    def setPayRate(self, rate): 
     self.__payRate = '$' + str(format(rate, ',.2f')) 

    # Getters 
    def getShiftNum(self): 
     return self.__shiftNum 

    def getPayRate(self): 
     return self.__payRate 

def main(): 
    gruntling = Employee('Farlo', 53400) 
    print('Your grunts name is' + gruntling.getName()) 
    print('this program does things. We swears.') 

    grunty = ProductionWorker('Farlo', 45300, 2, 4.25) 
    print('Lil grunty\'s name is ' + grunty.getName()) 

main() 

我得到的錯誤是:

Traceback (most recent call last): 
    File "C:/Users/sessh/Dropbox/Spring >2016/Python/Assignments/S13/company_employee.py", line 69, in <module> 
    main() 
    File "C:/Users/sessh/Dropbox/Spring >2016/Python/Assignments/S13/company_employee.py", line 66, in main 
    grunty = ProductionWorker('Farlo', 45300, 2, 4.25) 
    File "C:/Users/sessh/Dropbox/Spring >2016/Python/Assignments/S13/company_employee.py", line 38, in __init__ 
    self.setShiftNum(shiftnum) 
    File "C:/Users/sessh/Dropbox/Spring >2016/Python/Assignments/S13/company_employee.py", line 49, in setShiftNum 
    setShiftNum(self, num) 
NameError: name 'setShiftNum' is not defined 

我瀏覽周圍,我能找到的最接近的例子是 Calling a class function inside of __init__

我能找到的最好的解決是添加自我到初始化函數,但後來我得到了一些奇怪的錯誤關於有太多參數。我說瘋了!

謝謝你的時間。

編輯。好吧,我讀了一些評論,並改變了給我提出問題的函數的邏輯。另外,我沒有意識到錯誤完全是由於編譯器沒有看到該函數,因爲它不好。這是一個有趣的知識點:

# Overwritten constructor 
def __init__(self, name, empnum, shiftnum, rate): 
    #self.__shiftNum = shiftnum 
    self.__payRate = rate 
    self.setShiftNum(shiftnum) 
    # Calls Superclass Method 
    Employee.__init__(self, name, empnum) 

# Setters 
def setShiftNum(self, num): 
    shiftnum = num 
    if shiftnum == 1 or shiftnum == 2: 
     self.__shiftNum = shiftnum 
    else: 
     while True: 
      shiftnum = input('Shift Number MUST BE a 1 or a 2. Enter it now: ') 
      if shiftnum == 1 or shiftnum == 2: 
       self.__shiftNum = numshiftnum 
       break 
      else: 
       continue 

因此,你看到以前的遞歸函數。我喜歡無限循環。所以我創造了另一個,沒有任何意圖,我向你保證。如果1或2被傳遞給它,這個代碼實際上是有效的,但是如果不是這樣的話,你會被困在一個被動的攻擊性程序的永無止境的循環中,要求你從屬於1和2的輸入

在這一點上,我只是堅持情況的邏輯,所以我認爲我接近解決方案。我有一種感覺,邏輯的算法複雜性很差,但在這一點上,我只是想讓它工作。

+0

嘗試'self.setShiftNum(num)'。 –

+0

請注意,您也有無限遞歸。遞歸制定者是糟糕的設計。相反,它應該拋出異常或以其他方式指示不正確的參數。調用者然後負責處理錯誤。 –

+0

你可能會在這裏找到一些想法 - http://stackoverflow.com/a/23294659/2823755 – wwii

回答

0
def setShiftNum(self, num): 
    if num == 1 or num == 2: 
     self.__shiftNum = num 
    else: 
     print('Shift number needs to be a 1 or 2. Please try again') 
     self.setShiftNum(num) 

請注意,你的邏輯使得它運行到一個無限循環。
爲了防止考慮將遞歸塊替換爲self.setShiftNum(num = 1)之類的內容或更改您的邏輯。

+0

邏輯已更改。謝謝你的收穫。 – Rualani

+0

好的。所以即使我更新了這個問題,這個問題也解決了。這個問題稍微變成了關於循環邏輯的問題,所以我應該關閉這個問題? – Rualani

+0

我不確定,因爲我沒有通過更新的。也許有些人可能會發現我的解決方案很有用,所以如果您不確定,請不要關閉。 –

0

我只更改幾個代碼,然後運行。

def setShiftNum(self, num): 
    if num == 1 | 2: 
     self.__shiftNum = num 
    else: 
     print('Shift number needs to be a 1 or 2. Please try again') 
     self.setShiftNum(3) 

我不知道你想做什麼,所以'它。 所有你需要知道self.setShiftNum(3)將被轉換爲setShiftNum(self,3)。你只是滿足這一

class he(): 
    def __init__(self, arg): 
     self.arg = arg 
    def sayHi(self): 
     print("hello") 
if __name__ == '__main__': 
    d = he("Ads") 
    d.sayHi() 
    # sayHi(d)