如何解决Python提取PAO对象值时的“TypeError: 'PAO' object is not subscriptable”错误
解决混合字典与自定义类实例列表的属性/键访问冲突问题
问题根源
你的cards列表里同时存在两种异构对象:JSON加载生成的字典(只能用方括号['key']访问键值)和自定义PAO类的实例(只能用点标记.attribute访问属性),两种对象的访问方式不兼容,才会出现切换访问方式时的报错。
三种可行解决方案
1. 遍历前做类型判断,分别处理
在访问值之前先检查当前元素的类型,对应使用正确的访问方式:
for elem in cards: # 区分字典和PAO实例 if isinstance(elem, dict): number = elem['number'] elif isinstance(elem, PAO): number = elem.number # 后续逻辑处理number
2. 统一列表内的对象类型
把列表里的所有对象转换成同一种类型,避免异构带来的访问冲突:
把字典转成PAO实例(推荐,更符合面向对象设计)
假设你的PAO类支持通过关键字参数初始化,可直接用列表推导式转换:class PAO: def __init__(self, number, *args, **kwargs): self.number = number # 其他属性初始化逻辑 # 转换所有字典为PAO实例 cards = [PAO(**item) if isinstance(item, dict) else item for item in cards] # 之后统一用点标记访问 for elem in cards: number = elem.number把PAO实例转成字典
给PAO类添加一个转字典的方法,再统一转换:class PAO: # 原有逻辑 def to_dict(self): return { 'number': self.number, # 其他属性按需求映射为字典键值 } # 转换所有PAO实例为字典 cards = [item.to_dict() if isinstance(item, PAO) else item for item in cards] # 之后统一用方括号访问 for elem in cards: number = elem['number']
3. 让PAO类支持方括号访问
通过实现__getitem__魔法方法,让PAO实例也能像字典一样用方括号访问属性:
class PAO: def __init__(self, number): self.number = number def __getitem__(self, key): # 映射键到实例属性 return getattr(self, key) # 现在不管是字典还是PAO实例,都能用方括号访问 for elem in cards: number = elem['number']
内容的提问来源于stack exchange,提问作者programmerare
相关产品推荐
相关产品推荐

