Python排序Item对象列表报错:AttributeError: type object 'Item' has no attribute 'price'
嘿,这个AttributeError的问题我太熟了!大概率是你在排序的时候搞错了「Item类」和「Item实例」的区别,或者列表里根本没装对东西。我给你拆解几个最可能的原因和解决办法:
可能的问题&解决办法
1. 你的列表里装的不是Item对象,而是Item类本身!
这是最常见的坑。比如在read_file方法里,你可能不小心写了:
items.append(Item) # 错!加的是类,不是实例
而不是:
items.append(Item(price=提取到的价格)) # 对!要创建实例再添加
验证方法:遍历列表打印元素类型,看看是不是<class '__main__.Item'>:
for item in your_item_list: print(type(item))
如果输出是<class 'type'>,那就是加了类而非实例,修改append的代码即可。
2. 排序代码写错了,把Item类当成了排序对象
比如你可能写了:
sorted(Item, key=lambda x: x.price) # 错!排序的是类,不是列表
或者:
your_item_list.sort(key=Item.price) # 错!Item是类,没有实例的price属性
正确的排序应该针对你的Item对象列表,用lambda表达式取每个实例的price:
# 原地排序 your_item_list.sort(key=lambda item: item.price) # 生成新的排序列表 sorted_items = sorted(your_item_list, key=lambda item: item.price)
3. Item类的price属性定义有问题
检查你的Item类是不是在__init__里正确定义了实例属性:
class Item: def __init__(self, price): self.price = price # 这是每个实例独有的属性,正确!
如果你的price是定义成类属性(比如price = 0写在__init__外面),虽然理论上能访问,但如果实例化时没正确赋值,也可能出问题,但结合你的报错,前两个原因概率更高。
4. 读取文件时没正确提取price值
比如read_file里分割行内容后,可能没正确拿到price的数值,导致创建Item实例时传参错误,不过这种情况一般会报别的错,但也可以检查一下:
# 比如分割后打印看看内容 parts = line.strip().split() # 或者按你的分隔符分割 print(parts) # 确认有没有price对应的字段
先从第一点开始排查,基本上就能解决这个问题啦!
内容的提问来源于stack exchange,提问作者Camilo
相关产品推荐
相关产品推荐

