美文网首页
魔术方法(对象持久化)

魔术方法(对象持久化)

作者: 97833632c0c7 | 来源:发表于2018-06-01 13:03 被阅读0次

    ### Python内置的数据结构是直接可以被序列化的:

    字典、元组、列表、集合、字符串、整形、浮点型、布尔类型。

    ### 如果自己定义的对象想要能够被序列化,那么必须实现以下两个魔术方法:

    1. `__getstate__`:当这个对象被序列化的时候,会调用这个方法,然后将这个方法的返回值存储到硬盘中。这个方法的返回值必须是可序列化的。

    2. `__setstate__`:当从硬盘中加载一个对象的时候,会调用这个方法,并且将加载到的数据作为参数传递给这个方法。拿到这个数据后,就可以做自己的事情了,比如将之前的数据重新保存到这个对象上。

    #encoding: utf-8

    import pickle

    def dump_built_in_obj():

        data = {'foo': [1, 2, 3],

              'bar': ('Hello', 'world!'),

              'baz': True}

        with open('build_obj.pkl','wb') as fp:

            pickle.dump(data,fp)

    # dump_built_int_obj()

    def load_built_in_obj():

        with open('build_obj.pkl','rb') as fp:

            t = pickle.load(fp)

            print(t)

    class Cat(object):

        def __init__(self,name):

            self.name = name

    class Person(object):

        def __init__(self,name,age):

            self.name = name

            self.age = age

        def __getstate__(self):

            # 这个方法中,只能返回能被Pickle存储的数据结构

            return {"name":self.name,'age':self.age}

        def __setstate__(self, state):

            print(state)

            self.name = state['name']

            self.age = state['age']

        def __str__(self):

            return "Person(name:%s,age:%d)" % (self.name,self.age)

    def dump_obj():

        p1 = Person('zhiliao',18)

        with open('pickle_obj.pkl','wb') as fp:

            pickle.dump(p1,fp)

    def load_obj():

        with open('pickle_obj.pkl','rb') as fp:

            t = pickle.load(fp)

            print(t)

    load_obj()

    相关文章

      网友评论

          本文标题:魔术方法(对象持久化)

          本文链接:https://www.haomeiwen.com/subject/pgvmjftx.html