簡體   English   中英

來自派生類實例的 Pickle 基類

[英]Pickle base class from derived class instance

我的基類看起來像:

@dataclass
class A:
    var1: List[float]
    var2: float

和派生類看起來像:

class B(A):
    def __init__(self, v1):
        super().__init__(v1, 0)

    def process():
        pass

我想要一種方法來腌制B的一個實例,這樣只需要A類來解開它。 我知道python不支持向上轉換,但有沒有辦法實現我想要的? 我想要以下內容:

l1 = [1., 2., 4.]
obj = B(l1)
with open(filename, 'wb') as pickleFile:
    pickleFile.write(pickle.dumps((A)obj))

后續問題。 像這樣的東西有效,但我不確定后果:

l1 = [1., 2., 4.]
obj = B(l1)
obj.__class__ = A
with open(filename, 'wb') as pickleFile:
    pickleFile.write(pickle.dumps(obj))

任何幫助,將不勝感激。 謝謝!

您可以通過使用模塊級dataclasses.asdict()實用函數將B數據類對象轉換為dict (這是默認工廠函數)來有效地做您想做的事情,然后使用它來創建基類實例。 這與將B實例“向上轉換”為A實例並不完全相同,但效果相似。

import dataclasses
from dataclasses import dataclass
import pickle
from typing import List


@dataclass
class A:
    var1: List[float]
    var2: float

class B(A):
    def __init__(self, v1):
        super().__init__(v1, 0)

    def process(self):
        pass

    def as_A(self):
        d = dataclasses.asdict(obj)
        return A(**d)


filename = 'derived_class.pkl'
l1 = [1., 2., 4.]
obj = B(l1)
with open(filename, 'wb') as pickleFile:
    pickleFile.write(pickle.dumps(obj.as_A()))

暫無
暫無

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

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