类方法和静态方法的名称错误和回溯错误?

时间:2019-07-08 00:28:13

标签: python

我不确定为什么,但是我得到了一个名称错误雇员,该雇员尚未定义,但仍作为类名。我也收到一个追溯错误,但不确定为什么。希望对此有所帮助!

https://repl.it/repls/UnwieldyHorribleJavadoc

class Employee:

    num_of_emps = 0;
    raise_amt = 1.4;

    def __init__(self,first,last,pay):
        self.first = first
        self.last = last
        self.pay = pay

        Employee.num_of_emps += 1;
    def fullname(self):
        return '{} {}'.format(self.first, self.last)

    def apply_raise(self):
        self.pay = int(self.pay * self.raise_amt)

    def set_raise_amt(cls, amount):
      cls.raise_amt = amount


    emp_1 = Employee('Corey', 'Smith', 5000)
    emp_2 = Employee('Thomas', 'Hunt', 7000)

    Employee.set_raise_amt(1.05)

    print(Employee.raise_amt)
    print(emp_1.raise_amt)
    print(emp_2.raise_amt)

2 个答案:

答案 0 :(得分:1)

这很简单。空格在Python上在语法上很重要。在类定义之后,您打算在类定义之后发生的事情(并尝试引用您正在定义的类)。

class Employee:

    num_of_emps = 0;
    raise_amt = 1.4;

    def __init__(self,first,last,pay):
        self.first = first
        self.last = last
        self.pay = pay

        Employee.num_of_emps += 1;
    def fullname(self):
        return '{} {}'.format(self.first, self.last)

    def apply_raise(self):
        self.pay = int(self.pay * self.raise_amt)

    def set_raise_amt(cls, amount):
      cls.raise_amt = amount

# <<<<< from here down, unindent your code 
# <<<<< to cause it to execute AFTER the class definition

emp_1 = Employee('Corey', 'Smith', 5000)
emp_2 = Employee('Thomas', 'Hunt', 7000)

Employee.set_raise_amt(1.05)

print(Employee.raise_amt)
print(emp_1.raise_amt)
print(emp_2.raise_amt)

您的代码还有其他问题,但这可以回答您的问题。

答案 1 :(得分:0)

两个错误。

  1. 缩进很重要。 emp_1 = Employee('Corey', 'Smith', 5000)及其后几行不属于该类,因此应加以注意。
  2. 使用它的方式set_raise_amt(cls, amount)应该是一个类方法,它需要适当的装饰器。

您可以这样解决它:

class Employee:

    num_of_emps = 0;
    raise_amt = 1.4;

    def __init__(self,first,last,pay):
        self.first = first
        self.last = last
        self.pay = pay

        Employee.num_of_emps += 1;
    def fullname(self):
        return '{} {}'.format(self.first, self.last)

    def apply_raise(self):
        self.pay = int(self.pay * self.raise_amt)

    @classmethod
    def set_raise_amt(cls, amount):
        cls.raise_amt = amount


emp_1 = Employee('Corey', 'Smith', 5000)
emp_2 = Employee('Thomas', 'Hunt', 7000)

Employee.set_raise_amt(1.05)

print(Employee.raise_amt)
print(emp_1.raise_amt)
print(emp_2.raise_amt)

不确定这是否真的是您想要的,但是运行时没有错误,并打印了1.05 3次。