import pickle
# Set up class_A and class_B as in the question
class class_A:
def __init__(self):
self.a = 1
def method_a(self): pass
class class_B(class_A):
def __init__(self):
super().__init__()
self.b = 1
def method_b(self): pass
# Create an pickle a class_A object
a = class_A()
with open('pickle', 'wb') as f:
pickle.dump(a, f)
# Create an unpickler that lies about class types
class MyUnpickler(pickle.Unpickler):
def find_class(self, module, name):
if (module, name) == ('__main__', 'class_A'):
name = 'class_B'
return pickle.Unpickler.find_class(self, module, name)
# Unpickle with the transmorgifying unpickler
with open('pickle', 'rb') as f:
new_b = MyUnpickler(f).load()
# Verify that the returned object is a `class_B`
assert isinstance(new_b, class_B)
assert hasattr(new_b, 'method_a')
assert hasattr(new_b, 'method_b')
assert hasattr(new_b, 'a')
# Sadly, new_b.__init__ never ran, so no `new_b.b`
assert not hasattr(new_b, 'b')
关于您的确切用例的更多细节需要确定,但是这些抽象方法中的一种可能适合您。你知道吗
或者
或者
我建议用一个类方法来做你需要的事情。你知道吗
可以重写unpickler的
find_class
函数,如下所示:引用:https://docs.python.org/3/library/pickle.html#pickle.Unpickler.find_class
相关问题 更多 >
编程相关推荐