如何在Python中将类转换为它的子类?

2024-04-26 04:46:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为class_A的类,我对它做了一些工作,并用pickle存储它。 我有另一个类class_B,它是class_A的子类,但是有一些附加的方法和属性。我想从我的pickle文件中以class_B的形式加载数据并使用它。我该怎么做?你知道吗


Tags: 文件数据方法属性子类pickle形式class
2条回答

关于您的确切用例的更多细节需要确定,但是这些抽象方法中的一种可能适合您。你知道吗

b = Class_B()
b.__dict__ = pickled_data

或者

b = Class_B(**pickled_data)

或者

a = Class_A()
b = Class_B()
b.__dict__ = a.__dict__

我建议用一个类方法来做你需要的事情。你知道吗

b = B.from_a(class_a, *args, **kwargs)

可以重写unpickler的find_class函数,如下所示:

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')

引用:https://docs.python.org/3/library/pickle.html#pickle.Unpickler.find_class

相关问题 更多 >