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
相关产品推荐
相关产品推荐

