You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:47:31