Python:Pickle派生类,就好像它们是基类的实例一样

时间:2010-12-21 15:16:55

标签: python subclass pickle

我想定义一个基类,以便在派生类实例被pickle时,它们被腌制,好像它们是基类的实例一样。这是因为派生类可能存在于酸洗的客户端而不存在于服务器端,但这对服务器来说并不重要,因为它只需要来自基类的信息。我不想为每个客户端动态创建类。

基类只是一个“对象句柄”,它包含一个ID,在服务器上定义了方法,但我希望客户端能够子类化服务器类并定义新方法(只能通过客户,但这没关系。)

2 个答案:

答案 0 :(得分:2)

相信你可以通过给对象一个__reduce__方法,返回一个元组来实现它,其中第一部分应该是BaseClass.__new__(这将在在unpickling中加载对象)。有关详细信息,请参阅pickle文档(Python 2Python 3)。我没想过这个。

根据您正在做的事情,使用更简单的序列化格式(如JSON)可能更容易,并且每边都有代码来重建相关对象。

答案 1 :(得分:0)

您可以在Python中动态更改对象的类:

import cPickle as pickle

class Foo(object):
    def __init__(self):
        self.id=1
class Bar(Foo):
    def derived_class_method(self): pass

bar=Bar()
bar.id=2
bar.__class__=Foo                # changes `bar`'s class to Foo
bar_pickled=pickle.dumps(bar)
bar2=pickle.loads(bar_pickled)
bar.__class__=Bar                # reset `bar`'s class to Bar
print(repr(bar2))
# <__main__.Foo object at 0xb76b08ec>
print(bar2.id)
# 2
但是,我不确定使用这是最好的设计决定。我喜欢使用JSON的Thomas K's idea