如何解决类型错误并使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
相关产品推荐
相关产品推荐

