Python OOP实现员工列表按rating排序触发对象不可迭代报错
问题说明
Python初学者学习面向对象编程(OOP)时,目标是实现按评级(rating)字段对员工列表排序,运行时触发*object not iterable(对象不可迭代)*报错,无法完成排序,原始实现代码如下:
class Employee: def getfn(self): self.empid=(input(" enter emp id:")) self.name=input("enter name:") self.gender=input("enter emp gender: ") self.salary=input(" enter emp salary:") self.rating=int(input("enter rating:")) empz=[] class menu: n=0 def entry(self): n=int(input(" enter no of employees:")) i=0 while i<n: temp_emp=Employee() temp_emp.getfn() empz.append(temp_emp) i+=1 def print_rec(self): # print("-id--name--gender--salary--rating--") for i in empz: print(i.empid,i.name,i.gender,i.salary,i.rating) #print(sorted(empz,key=lambda x:x[4])) def sort_rating(empz): return empz.rating sorted_emp=sorted(empz, key= sort_rating) print(empz)
错误原因
- 代码执行顺序错误:排序逻辑直接写在全局作用域,脚本启动后会立刻执行
sorted(),此时既没有实例化menu类,也没有调用entry()方法录入员工数据,empz是空列表,甚至后续根本不会触发数据录入流程。 - 取值逻辑错误:注释里的
lambda x:x[4]写法不适用类实例场景,Employee生成的对象是自定义类实例,不是列表/元组,不能用下标索引取值,必须通过.属性名的方式访问字段。 - 输出逻辑错误:排序结果存入了
sorted_emp变量,但最后打印的是原始未排序的empz列表,就算排序成功也看不到结果。
修复后完整代码
class Employee: def getfn(self): self.empid = input(" enter emp id:") self.name = input("enter name:") self.gender = input("enter emp gender: ") self.salary = input(" enter emp salary:") self.rating = int(input("enter rating:")) empz = [] class Menu: def entry(self): n = int(input(" enter no of employees:")) i = 0 while i < n: temp_emp = Employee() temp_emp.getfn() empz.append(temp_emp) i += 1 def print_rec(self, emp_list): print("-id--name--gender--salary--rating--") for emp in emp_list: print(emp.empid, emp.name, emp.gender, emp.salary, emp.rating) def sort_rating(emp_item): return emp_item.rating # 主执行流程 if __name__ == "__main__": # 1. 实例化菜单,录入员工数据 menu = Menu() menu.entry() # 2. 数据录入完成后再按rating排序 sorted_emp = sorted(empz, key=sort_rating) # 3. 分别打印排序前、排序后的结果 print("排序前员工列表:") menu.print_rec(empz) print("按评级排序后员工列表:") menu.print_rec(sorted_emp)
关键修改点
- 调整执行顺序:把数据录入、排序、打印的逻辑放到主执行流程里,确保先完成员工数据录入,
empz列表存入有效Employee对象之后再执行排序操作。 - 规范命名:将类名
menu改为首字母大写的Menu,符合Python类命名的通用规范;调整循环、函数内的变量名,避免和全局的empz列表重名引发歧义。 - 优化打印方法:给
print_rec增加列表入参,支持打印任意传入的员工列表,不需要绑定全局变量。 - 修正输出目标:排序后调用打印方法传入
sorted_emp,可以直接看到排序后的实际效果。 - 规避错误取值方式:全程通过
.rating属性访问员工评级字段,不要对自定义类实例使用下标索引取值,避免触发类型错误。
内容的提问来源于stack exchange,提问作者Anshul Kamboj
相关产品推荐
相关产品推荐

