[英]Python: Pickle derived classes as if they were an instance of the base class
[英]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.