gpt4 book ai didi

python - 使用Python "json"模块使类可序列化

转载 作者:行者123 更新时间:2023-12-01 06:08:13 30 4
gpt4 key购买 nike

我正在Python中使用Email()类,我想将其扩展为SerializeEmail()类,该类仅添加另外两个方法,.write_email()和.read_email()。我想要这种行为:

# define email
my_email = SerializeEmail()
my_email.recipients = 'link@hyrule.com'
my_email.subject = 'RE: Master sword'
my_email.body = "Master using it and you can have this."
# write email to file system for hand inspection
my_email.write_email('my_email.txt')
...
# Another script reads in email
my_verified_email = SerializeEmail()
my_verified_email.read_email('my_email.txt')
my_verified_email.send()

我已经完成了 json 编码/解码过程,并且可以成功编写 SerializeEmail() 对象并将其读入,但是,我找不到通过 SerializeEmail.read_email() 重新创建对象的令人满意的方法打电话。

class SerializeEmail(Email):

def write_email(self,file_name):

with open(file_name,"w") as f:
json.dump(self,f,cls=SerializeEmailJSONEncoder,sort_keys=True,indent=4)

def read_email(self,file_name):

with open(file_name,"r") as f:
json.load(f,cls=SerializeEmailJSONDecoder)

这里的问题是,我的 read_email() 方法中的 json.load() 调用返回了 SerializeEmail 对象的实例,但没有将该对象分配给我用来调用它的当前实例。所以现在我必须做这样的事情,

another_email = my_verified_email.read_email('my_email.txt')

当我想要调用 my_veridied_email.read_email() 时,用文件中的数据填充 my_verified_email 的当前实例。我已经尝试过

self = json.load(f,cls=SerializeEmailJSONDecoder)

但这不起作用。我可以将返回对象的每个单独元素分配给我的“ self ”对象,但这似乎是临时且不优雅的,并且我正在寻找“正确的方法”来执行此操作(如果存在)。有什么建议么?如果您认为我的整个方法有缺陷并建议采用不同的方法来完成此任务,请为我勾勒出轮廓。

最佳答案

虽然您可以跳过许多步骤将序列化内容加载到现有实例中,但我不建议这样做。这是一种不必要的复杂化,对你没有任何好处;这意味着每次您想要从 JSON 加载电子邮件时都需要创建虚拟实例的额外步骤。我建议使用工厂类或工厂方法,从序列化 JSON 加载电子邮件并将其作为新实例返回。我个人更喜欢工厂方法,您可以按如下方式完成:

class SerializeEmail(Email):

def write_email(self,file_name):

with open(file_name,"w") as f:
json.dump(self,f,cls=SerializeEmailJSONEncoder,sort_keys=True,indent=4)

@staticmethod
def read_email(file_name):

with open(file_name,"r") as f:
return json.load(f,cls=SerializeEmailJSONDecoder)

# You can now create a new instance by simply doing the following:
new_email = SerializeEmail.read_email('my_email.txt')

注意 @staticmethod装饰器,它允许您调用类上的方法,而无需传入任何隐式第一个参数。通常工厂方法将是 @classmethod s,但由于您是从 JSON 加载对象,因此不需要隐式类参数。

请注意,通过此修改,您无需实例化 SerializeEmail 对象即可从 JSON 加载另一个对象。您只需直接在类上调用该方法即可获得所需的行为。

关于python - 使用Python "json"模块使类可序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7084851/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com