簡體   English   中英

Python:Pickle派生類,就好像它們是基類的實例一樣

[英]Python: Pickle derived classes as if they were an instance of the base class

我想定義一個基類,以便在派生類實例被pickle時,它們被腌制,好像它們是基類的實例一樣。 這是因為派生類可能存在於酸洗的客戶端而不存在於服務器端,但這對服務器來說並不重要,因為它只需要來自基類的信息。 我不想為每個客戶端動態創建類。

基類只是一個“對象句柄”,它包含一個ID,在服務器上定義了方法,但我希望客戶端能夠子類化服務器類並定義新方法(只能由客戶端看到,但那沒關系)。

相信你可以通過給對象一個__reduce__方法,返回一個元組來做到這一點,其中第一部分應該是BaseClass.__new__ (這將在unpickling中加載對象時調用)。 有關詳細信息,請參閱pickle文檔( Python 2Python 3 )。 我沒試過這個。

根據您正在做的事情,使用更簡單的序列化格式(如JSON)可能更容易,並且每側都有代碼來重建相關對象。

您可以在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

但是,我不確定使用這是最好的設計決定。 我喜歡Thomas K的使用JSON 的想法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM