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

Python同一类中从__init__方法调用列表至其他方法时出现NameError错误的解决方法

解决Python类中访问__init__列表时的NameError问题

你的问题很典型——虽然在__init__里用self.e_list把列表绑定到了实例上,但在calsal方法里访问的时候,漏掉了self.前缀,导致Python找不到这个变量。

错误原因

在calsal方法中,你写了e_list[i],但这个e_list只是__init__方法的局部参数,并不是类实例的属性。类的实例属性必须通过self.来引用,否则Python会认为你在找当前方法的局部变量或者全局变量,而这些变量根本不存在,所以抛出了NameError。

修正后的代码

我不仅修复了NameError,还调整了一些逻辑问题和代码规范:

class Department():  # 遵循PEP8规范,类名用大驼峰
    def __init__(self, d_name, e_list):
        self.d_name = d_name
        self.e_list = e_list

    def calsal(self, bonus, designation):
        count = 0
        # 直接遍历员工对象,比用索引更简洁直观
        for emp in self.e_list:
            # 修正逻辑:应该比较员工的职位和传入的职位参数
            if emp.designation.lower() == designation.lower():
                # 调用对应员工的salary对象的更新方法
                emp.salary.update_salary(bonus)
                print(emp.employee_id)
                print(emp.employee_name)
                print(emp.designation)
                print(emp.salary)
                count = 1
        if count == 0:
            print('Employee Not Found')

关键修改点

  • 添加self.前缀:把所有e_list[i]替换成self.e_list[i](或者直接遍历元素emp),确保访问的是实例的e_list属性。
  • 修正判断逻辑:原来的代码用员工名字和职位参数比较,这显然不符合需求——应该比较员工的designation(职位)和传入的designation,这样才能找到对应职位的员工。
  • 修正方法调用:salary.update_salary(bonus)应该改成emp.salary.update_salary(bonus),因为update_salary是每个员工的salary对象的方法,需要通过具体的员工实例来调用。
  • 规范命名:把类名department改成Department,符合Python的PEP8命名规范,提高代码可读性。

这样修改后,代码就能正常运行,不会再出现NameError了。

内容的提问来源于stack exchange,提问作者Aditya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:52:39