__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) 之类的内容或更改您的逻辑。