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

魔术方法(对象持久化)

作者: 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()

相关文章

  • 魔术方法(对象持久化)

    ### Python内置的数据结构是直接可以被序列化的: 字典、元组、列表、集合、字符串、整形、浮点型、布尔类型。...

  • Python 进阶之魔术方法

    Python魔术方法 __开头,__结尾的方法就是魔术方法. 1.__str__格式化输出对象__repr__表示...

  • Day29 Hibernate第二天

    1. 持久化对象的状态 2. Hibernate的一级缓存 3. 操作持久化对象的方法 4. Hibernate基...

  • python 标准库学习笔记《四》

    魔术方法 __ new __ 创建实例对象 __ init __ 将传入的参数用于初始化实例对象 Notes:...

  • PHP反序列化总结

    问题原因:漏洞的根源在于unserialize()函数的参数可控。如果反序列化对象中存在魔术方法,而且魔术方法中的...

  • session.save()

    先理解hibernate对象三种持久化状态。首先,session.save()方法的功能将对象持久化到数据库中,对...

  • 28.Python之内置的魔术方法

    Python之内置的魔术方法 __call__方法在调用对象时(实例化的对象加括号),会自动触发类中的__call...

  • Java中序列化和反序列化以及关键字 transient

    总结 序列化的场景和作用:内存对象状态持久化、网络传输、远程方法调用传输对象 实现序列化方式:Serializat...

  • hiberante3-day2

    一、hibernate持久化对象状态(一级缓存)持久化对象 Persistent Object = POJO +...

  • 数据持久化

    什么是对象持久化 所谓持久化(Persistence)即把数据(如内存中的对象)保存到持久化的设备,即可永远保存到...

网友评论

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

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