Python子类CommissionPaid运行报错,请求修复帮助
问题:CommissionPaid子类触发NameError错误
我实现了继承自Employee类的CommissionPaid子类,编写了实例化该子类的主程序,但运行时触发NameError错误,提示在CommissionPaid类的__str__方法中调用pay()时,变量base_rate和sales未定义。尝试初始化pay方法的参数后问题仍未解决,相关代码及报错信息如下:
CommissionPaid类代码
class CommissionPaid(Employee): def __init__(self, name, dept, base_rate, sales): super().__init__(name, dept) self.__base_rate = base_rate self.__sales = sales def get_base_rate(self): return self.__base_rate def get_sales(self): return self.__sales def get_employee_type(self): return 'Commission Paid' def set_base_rate(self, base_rate): self.__base_rate = base_rate def set_sales(self, sales): self.__sales = sales def pay(self, base_rate = 0.0, sales = 0.0): if sales > 10000: pay = sales * .02 + base_rate return pay elif sales >= 5000 and sales <=10000: pay = sales * .01 + base_rate return pay elif sales < 5000: return base_rate def __str__(self): return f'self.get_employee_type() \t {super().__str__()} \t {self.pay(base_rate, sales)}'
主程序代码
from employees import CommissionPaid, HourlyPaid def main(): employee1 = CommissionPaid('Fname1 Lname1', 'Marketing', 500, 30000) employee2 = CommissionPaid('Fname2 Lname2', 'Sales', 1000, 8000) employee3 = HourlyPaid('Fname3 Lname3', 'Accounting', 55, 20.5) employee4 = HourlyPaid('Fname4 Lname4', 'Finance', 35, 30) employee_list = [employee1, employee2, employee3, employee4] return employee_list def print_employee_list(employee_list): print('Employee Type \t Employee Name \t Department \t Weekly Pay') print('_____________ \t _____________ \t ___________ \t _____________') print(employee_list[0].__str__()) print(employee_list[1].__str__()) print(employee_list[2].__str__()) print(employee_list[3].__str__()) print('\n',total_pay()) def total_pay(employee_list): total_pay = 0 for index in employee_list: total_pay += employee_list[index].pay() return f'Total Weekly Pay: ${total_pay}' employee_list = main() print(employee_list[0]) print_employee_list(employee_list)
报错信息
Traceback (most recent call last): File "F:/Classes/Python/Python II/COSC 1437/Programming Assignments/2/assignment2_Carissa_Sims.py", line 32, in <module> print(employee_list[0]) File "F:/Classes/Python/Python II/COSC 1437/Programming Assignments/2\employees.py", line 63, in __str__ return f'self.get_employee_type() \t {super().__str__()} \t {self.pay(base_rate, sales)}' NameError: name 'base_rate' is not defined
解决方案
1. 修复__str__方法的变量引用错误
__str__方法里的base_rate和sales是未定义的局部变量,应该调用实例的get方法获取存储的属性值;同时self.get_employee_type()需要放在f-string的大括号中,否则会直接显示字符串而非方法返回值。
修复后的__str__方法:
def __str__(self): return f'{self.get_employee_type()} \t {super().__str__()} \t {self.pay(self.get_base_rate(), self.get_sales())}'
2. 优化pay方法的参数设计
当前pay方法需要传入base_rate和sales,但实例本身已经通过__init__存储了这两个属性,完全可以直接在方法内部访问,无需额外传参,这样调用更简洁。
修改后的pay方法:
def pay(self): sales = self.__sales base_rate = self.__base_rate if sales > 10000: return sales * 0.02 + base_rate elif 5000 <= sales <= 10000: return sales * 0.01 + base_rate else: return base_rate
此时__str__方法可以简化为:
def __str__(self): return f'{self.get_employee_type()} \t {super().__str__()} \t {self.pay()}'
3. 修复主程序的两处逻辑错误
print_employee_list中调用total_pay()时未传入employee_list参数,会触发参数缺失错误;total_pay函数的循环中,index是列表中的员工实例而非索引,直接调用index.pay()即可,无需通过employee_list[index]访问。
修改后的主程序相关函数:
def print_employee_list(employee_list): print('Employee Type \t Employee Name \t Department \t Weekly Pay') print('_____________ \t _____________ \t ___________ \t _____________') # 用循环遍历打印更简洁 for emp in employee_list: print(emp) print('\n', total_pay(employee_list)) def total_pay(employee_list): total_pay = 0 for emp in employee_list: total_pay += emp.pay() return f'Total Weekly Pay: ${total_pay}'
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

