魔术方法(对象持久化)

2018-06-01  本文已影响0人  97833632c0c7

### 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()

上一篇 下一篇

猜你喜欢

热点阅读