Python内部类转JSON报错:'NoneType'不可调用,是否因初始化设为None?
自定义类生成JSON时出现TypeError: 'NoneType' object is not callable的问题解决
问题根源
是的,报错的直接原因就是你在OuterClass的__init__方法中把self.Header和self.Body设为None。
原本OuterClass内部定义了Header和Body两个嵌套类,当你创建response = OuterClass()实例后,__init__方法会将实例的Header、Body属性直接覆盖为None。此时再执行response.Header(...),本质是尝试调用None这个不可调用对象,自然会抛出TypeError: 'NoneType' object is not callable。
另外还要注意,你的代码还有一个隐藏问题:datetime对象默认无法被json.dumps序列化,即使解决了前面的错误,后续也会遇到序列化失败的问题。
修复方案
方案一:移除__init__中对属性的错误赋值
删除OuterClass.__init__里对self.Header和self.Body的赋值,创建嵌套类的实例后再赋值给OuterClass实例的对应属性,同时处理datetime序列化问题:
import json from datetime import datetime import pytz class OuterClass: class Header: def __init__(self, ID=None, Name=None): self.ID = ID self.Name = Name class Body: def __init__(self, DateTime=None, Display=None): self.DateTime = DateTime self.Display = Display def current_time_by_timezone(timezone_input): return datetime.now(pytz.timezone(timezone_input)) if __name__ == '__main__': response = OuterClass() # 创建嵌套类实例并赋值给response的属性 response.Header = OuterClass.Header('123', 'Some Name') response.Body = OuterClass.Body(current_time_by_timezone('US/Central'), 'NOT VALID') # 使用default=str处理datetime对象的序列化 print(json.dumps(response.__dict__, default=str))
方案二:优化OuterClass的初始化逻辑
更合理的写法是让OuterClass的__init__直接接收Header和Body实例,代码结构更清晰:
import json from datetime import datetime import pytz class OuterClass: class Header: def __init__(self, ID=None, Name=None): self.ID = ID self.Name = Name class Body: def __init__(self, DateTime=None, Display=None): self.DateTime = DateTime self.Display = Display def __init__(self, header=None, body=None): self.Header = header self.Body = body def current_time_by_timezone(timezone_input): return datetime.now(pytz.timezone(timezone_input)) if __name__ == '__main__': header = OuterClass.Header('123', 'Some Name') body = OuterClass.Body(current_time_by_timezone('US/Central'), 'NOT VALID') response = OuterClass(header, body) # 使用default=str处理datetime对象的序列化 print(json.dumps(response.__dict__, default=str))
内容的提问来源于stack exchange,提问作者SoftwareDveloper
相关产品推荐
相关产品推荐

