Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python“;json";模块使类可序列化_Python_Json - Fatal编程技术网

使用Python“;json";模块使类可序列化

使用Python“;json";模块使类可序列化,python,json,Python,Json,我正在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

我正在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()调用重新创建我的对象

这里的问题是,我的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加载电子邮件时,都需要额外的步骤来创建虚拟实例。我建议使用factory类或factory方法,从序列化的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')
注意decorator,它允许您在不传入任何隐式第一个参数的情况下调用类上的方法。通常工厂方法是s,但由于您是从JSON加载对象,因此隐式类参数是不必要的

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

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')