如何在Python中Pickle序列化类实例并持久化其方法?
序列化Python类实例并保留方法与属性的持久性
方法1:使用dill的byref=False参数序列化实例
默认情况下,dill序列化实例时仅保存对类的引用,加载时会调用当前环境中的类方法。设置byref=False可以将类的完整定义(包括所有方法)与实例属性一同序列化,彻底摆脱对当前类定义的依赖。
序列化代码:
import dill class Test(): def __init__(self, value=10): self.value = value def foo(self): print(f"Bar! Value is: {self.value}") t = Test(value=20) with open('Test.pkl', 'wb+') as fp: dill.dump(t, fp, byref=False) # 关键参数:禁用类引用 print('Original: ') t.foo() # 输出 "Bar! Value is: 20"
修改类后加载实例:
class Test(): def __init__(self, value=10): self.value = value def foo(self): print("...not bar?") with open('Test.pkl', 'rb') as fp: t2 = dill.load(fp) print('Reloaded: ') t2.foo() # 输出 "Bar! Value is: 20",保留旧方法与自定义属性
方法2:将类方法绑定为实例属性
在实例化时,把类方法赋值为实例自身的属性,这样序列化时会将方法作为实例的一部分保存,而非从类中动态查找。
序列化代码:
import dill class Test(): def __init__(self, value=10): self.value = value self.foo = self.foo # 将方法绑定为实例属性 def foo(self): print(f"Bar! Value is: {self.value}") t = Test(value=20) with open('Test.pkl', 'wb+') as fp: dill.dump(t, fp) print('Original: ') t.foo() # 输出 "Bar! Value is: 20"
修改类后加载实例:
class Test(): def __init__(self, value=10): self.value = value def foo(self): print("...not bar?") with open('Test.pkl', 'rb') as fp: t2 = dill.load(fp) print('Reloaded: ') t2.foo() # 输出 "Bar! Value is: 20"
方法3:自定义__reduce__序列化逻辑
通过重写类的__reduce__方法,明确指定序列化时要保存的属性与方法,实现完全可控的对象重建过程。
序列化代码:
import dill class Test(): def __init__(self, value=10): self.value = value def foo(self): print(f"Bar! Value is: {self.value}") def __reduce__(self): # 返回(构造函数,构造参数,实例状态) return ( self.__class__, (self.value,), {'value': self.value, 'foo': self.foo} ) t = Test(value=20) with open('Test.pkl', 'wb+') as fp: dill.dump(t, fp) print('Original: ') t.foo() # 输出 "Bar! Value is: 20"
修改类后加载实例:
class Test(): def __init__(self, value=10): self.value = value def foo(self): print("...not bar?") with open('Test.pkl', 'rb') as fp: t2 = dill.load(fp) print('Reloaded: ') t2.foo() # 输出 "Bar! Value is: 20"
内容的提问来源于stack exchange,提问作者thehumaneraser
相关产品推荐
相关产品推荐

