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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:06:21