为什么我不能覆盖使用"dataclasses_json"的"dataclass"对象的"to_dict"方法?



dataclasses_json是一个为python的数据类提供JSON功能的库。我注意到覆盖to_dict方法没有效果。下面是一个示例:

@dataclass_json
@dataclass
class Message2:
message: str
weight: int
def to_dict(self, encode_json=False):
print('Custom to_dict')
ret = {'MESSAGE': self.message, 'WEIGHT': self.weight}
return ret
m2 = Message2('m2', 2)
print(m2.to_dict())

代码打印以下内容:

{'消息': 'm2', '重量': 2}

当我期待时

Custom to_dict
{'MESSAGE': 'm2', 'WEIGHT': 2}

如果我删除@dataclass_json行,我会得到所需的输出。

所以,我的问题是:

  1. 为什么定义一个函数对@dataclass_json没有影响,但没有它就可以工作?

  2. 如何覆盖to_dict并使用@dataclass_json

  1. 因为dataclass_json只是在这里覆盖了您的to_dict方法:
cls.to_dict = DataClassJsonMixin.to_dict
  1. 一种可能的方法是定义一个具有不同名称的方法,并在应用dataclass_json装饰器后使用此方法创建to_dict方法。使用装饰器的完整示例:
from dataclasses import dataclass
from dataclasses_json import dataclass_json

def recover_to_dict(cls):
if hasattr(cls, '_to_dict'):
setattr(cls, 'to_dict', getattr(cls, '_to_dict'))
return cls

@recover_to_dict
@dataclass_json
@dataclass
class Message2:
message: str
weight: int
def _to_dict(self, encode_json=False):
print('Custom to_dict')
ret = {'MESSAGE': self.message, 'WEIGHT': self.weight}
return ret
m2 = Message2('m2', 2)
print(m2.to_dict())

最新更新