问题描述
我希望将整个类序列化为json。但是,我需要的大多数变量都是静态变量(未在__init__()
中定义)。除了朴素的解决方案之外,是否还有Python的方法可以做到这一点,即按名称调用所有变量?
到目前为止,我尝试使用编码器调用json.dump()
来处理numpy数组:
cfg = MyConfig(Config)
class NumpyEncoder(json.JSONEncoder):
def default(self,obj):
if isinstance(obj,np.ndarray):
return obj.tolist()
return json.JSONEncoder.default(self,obj)
with open(os.path.join(logs_dir,'config.json'),'w') as file:
json.dump(cfg.__dict__,file,cls = NumpyEncoder)
但是(当然),此代码段仅处理__init__()
中声明的三个变量,而忽略了静态变量。
更多信息,以防万一:
我想序列化一个从Mask RCNN中的config
继承的类。
解决方法
因此,我做了一些研究并找到了解决方案,以防万一有人通过Google到达这里。保存所有类变量(甚至是静态变量)的方法是使用类名而不是实例名调用json.dump()
,就像这样:
with open(os.path.join(logs_dir,'config.json'),'w') as file:
json.dump(Config.__dict__.copy(),file,cls = NumpyEncoder)
我在copy()
上调用Config.__dict__
的原因是,在类(不是实例)上调用__dict__
返回了一个mappingproxy
对象,该对象不能使用幼稚地写入json dump()
。处理对象会将其变成字典,从而解决了该问题。