我正在學習有關繼承和多態現在,此代碼應該測試這些概念。當我嘗試實例化子類對象時,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的輸入
在這一點上,我只是堅持情況的邏輯,所以我認爲我接近解決方案。我有一種感覺,邏輯的算法複雜性很差,但在這一點上,我只是想讓它工作。
嘗試'self.setShiftNum(num)'。 –
請注意,您也有無限遞歸。遞歸制定者是糟糕的設計。相反,它應該拋出異常或以其他方式指示不正確的參數。調用者然後負責處理錯誤。 –
你可能會在這裏找到一些想法 - http://stackoverflow.com/a/23294659/2823755 – wwii