我有一门课,像:
class Pathology:
"""
Represents a pathology, which is initialized with a name and description.
"""
def __init__(self: str, name: str, description: str):
self.id = str(uuid.uuid4())
self.name = name
self.description = description
self.phases = []
def to_json(self):
return jsonpickle.encode(self, make_refs=False, unpicklable=False)
在这个类中,我不希望用户为id
传递值,我总是希望在构造时生成它
从JSON反序列化时,我希望执行以下操作:
with open('data/test_case_1.json', 'r') as test_case_1_file:
test_case_1 = test_case_1_file.read()
# parse file
obj = jsonpickle.decode(test_case_1)
assert pathology == Pathology(**obj)
但是,我遇到了一个错误TypeError: __init__() got an unexpected keyword argument 'id'
我怀疑这是因为init构造函数没有可用的id
字段
什么是Python式的方式来支持这种行为
基于上述期望的结果,我的建议是将id定义为(只读)
property
。将其定义为属性的好处是,它不会被视为实例属性,而且巧合的是,它不会通过构造函数接受值;主要的缺点是它不会显示在类的__repr__
值(假设我们使用从dataclasses获得的生成值)或dataclasses.asdict
helper函数中我还在实现中添加了一些额外的更改(希望更好):
将类重新声明为dataclass,我个人更喜欢这样,因为它减少了一些样板代码,例如
__init__
构造函数,或者需要定义一个__eq__
方法(后者通过==
检查两个类对象是否相等)。dataclasses模块还提供了一个有用的asdict
函数,我们可以在序列化过程中使用它通过json模块使用内置JSON(反)序列化。做出这个决定的部分原因是我个人从未使用过
jsonpickle
模块,我对酸洗的工作原理只有基本的了解。我觉得将类对象转换为JSON或从JSON转换为类对象更自然,而且在任何情况下都可能表现得更好添加一个
from_json_file
helper方法,我们可以使用它从本地文件路径加载一个新的类对象下面是我整理的一些快速代码,以确认一切都如预期的那样:
相关问题 更多 >
编程相关推荐