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

如何解决类型错误并使type创建的JSONEncoder子类可迭代?

问题解决:动态类创建错误与可迭代性实现

1. 先修复TypeError错误

你当前的报错出在动态创建ChildClass的代码行:

ChildClass = type('ChildClass', tuple(ParentClass), attrs)

type()函数的第二个参数要求是父类组成的元组,而tuple(ParentClass)会尝试迭代ParentClass这个类对象(类本身不是可迭代类型),所以触发'type' object is not iterable错误。正确写法是直接传入包含父类的元组:

ChildClass = type('ChildClass', (ParentClass,), attrs)

2. 让ChildClass具备可迭代性

要让类的实例支持迭代,需要在类中定义__iter__方法,返回一个迭代器。根据你的需求,比如要迭代field1、field2这类属性,可以在attrs字典中添加该方法:

完整示例代码

from json import JSONEncoder

class ParentClass(JSONEncoder):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def default(self, obj):
        try:
            return super().default(obj)
        except TypeError as exc:
            if 'not JSON serializable' in str(exc):
                return str(obj)
        raise

class AnotherClass():
    def do_something(self, *args, **kwargs):
        def __iter__(self):
            # 按需求定义迭代内容,这里返回field1和field2的值
            yield self.field1
            yield self.field2

        attrs = {
            'field1': "FieldOne",
            'field2': "FieldTwo",
            '__iter__': __iter__
        }
        # 修复后的动态类创建代码
        ChildClass = type('ChildClass', (ParentClass,), attrs)
        
        # 测试迭代功能
        instance = ChildClass()
        for item in instance:
            print(item)  # 依次输出: FieldOne、FieldTwo

说明

  • __iter__方法通过yield关键字返回要迭代的元素,你可以根据实际需求调整迭代的内容(比如迭代所有实例属性、特定字段集合等)。
  • 如果需要更复杂的迭代逻辑,也可以在__iter__中返回自定义的迭代器对象。

内容的提问来源于stack exchange,提问作者MeanwhileInHell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:40:03