为什么我不能覆盖使用“dataclasses_json”的“数据类”对象的“to_dict”方法?
Why can't I override `to_dict` method of a `dataclass` object that uses `dataclasses_json`?
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())
代码打印如下:
{'message': 'm2', 'weight': 2}
在我期待的时候
Custom to_dict
{'MESSAGE': 'm2', 'WEIGHT': 2}
如果删除 @dataclass_json
行,我会得到所需的输出。
所以,我的问题是:
为什么定义一个函数对 @dataclass_json
没有影响,但没有它就可以工作?
如何覆盖 to_dict
并使用 @dataclass_json
?
- 因为
dataclass_json
只是覆盖了您的 to_dict
方法 here:
cls.to_dict = DataClassJsonMixin.to_dict
- 一种可能的方法是定义一个具有不同名称的方法,并在应用
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())
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())
代码打印如下:
{'message': 'm2', 'weight': 2}
在我期待的时候
Custom to_dict
{'MESSAGE': 'm2', 'WEIGHT': 2}
如果删除 @dataclass_json
行,我会得到所需的输出。
所以,我的问题是:
为什么定义一个函数对
@dataclass_json
没有影响,但没有它就可以工作?如何覆盖
to_dict
并使用@dataclass_json
?
- 因为
dataclass_json
只是覆盖了您的to_dict
方法 here:
cls.to_dict = DataClassJsonMixin.to_dict
- 一种可能的方法是定义一个具有不同名称的方法,并在应用
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())