You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:07:08