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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:10:09