__init__ method exception - NameError: name 'setShiftNum' is not defined
__init__ method exception - NameError: name 'setShiftNum' is not defined
我目前正在学习继承和多态性,这段代码应该测试这些概念。当我尝试实例化子类对象时,init 构造函数无法识别该方法。这是代码。
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__
我能找到的最佳修复方法是将 self 添加到 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
在这一点上,我似乎只是停留在这种情况的逻辑上,所以我认为我已经接近解决方案了。我感觉逻辑的算法复杂度很差,但在这一点上,我只想让它工作。
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)
之类的内容或更改您的逻辑。
我目前正在学习继承和多态性,这段代码应该测试这些概念。当我尝试实例化子类对象时,init 构造函数无法识别该方法。这是代码。
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__
我能找到的最佳修复方法是将 self 添加到 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
在这一点上,我似乎只是停留在这种情况的逻辑上,所以我认为我已经接近解决方案了。我感觉逻辑的算法复杂度很差,但在这一点上,我只想让它工作。
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)
之类的内容或更改您的逻辑。