无需 pickle 即可进行序列化的 Python 类设置

标签 python oop file-io constructor

场景

我正在Python中寻找一种面向对象的方法,它可以将类的实例保存在数据文件中,并在以后的某个时间点再次加载它。我当前的方法如下:

class A(object):
    def __init__(self, ComplexParam1, ComplexParam2):
        self.ComplexParam1 = ComplexParam1
        self.ComplexParam2 = ComplexParam2

    @staticmethod
    def Create(EasyParam1, EasyParam2):
        #do some complex calculation to get ComplexParam1 and ComplexParam2 from EasyParam1 and EasyParam2
        return A(ComplexParam1, ComplexParam2)        

    def Save(self, Filename):
        #write ComplexParam1 and ComplexParam2 to disc

    @staticmethod
    def Load(Filename):
        #read ComplexParam1 and ComplexParam2 and call constructor
        return A(ComplexParam1, ComplexParam2)

如您所见 ComplexParam1ComplexParam2是要计算的参数,不用于第一次创建对象 A因为它们获取起来非常复杂,而EasyParam1EasyParam2是“已知”参数。把它想象成 EasyParameters是整数,ComplexParameters是基于 EasyParameters 构建的大型矩阵

所以我使用上面的设置 SaveLoad传入和传出文件的对象,其中 CreateComplexParam1起使用构造函数和ComplexParam2保存在文件中,不需要再次计算。

问题

到目前为止,上面显示的方法对我来说效果很好。然而,当该方案也与类继承一起使用时,就会出现问题。因此,我正在寻找更好、更干净的解决方案来解决我的问题。

在 C++ 中,我会重载构造函数并提供两个可能的类创建,但这在 Python 中不受支持。

感谢任何帮助、链接和建议。

最佳答案

我认为 @classmethod 就是这种情况装饰师。例如,如果将 Load 方法更改为以下内容:

    @classmethod
    def Load(cls, Filename):
        # Do stuff
        return cls(ComplexA, ComplexB)

然后你可以重写构造函数:

class B(A):
    def __init__(self, complexA, complexB):
        # Whatever you want, including calling the parent constructor

最后,您可以调用 B.Load(some_file) 来调用 B.__init__

关于无需 pickle 即可进行序列化的 Python 类设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14642848/

相关文章:

c++ - 平方根算法 C++

C++:OpenMP:为多线程复制函数指针

c++ - 这个 _com_ptr_t move 分配有什么目的吗?

android - 如何使 Android 应用程序成为文件类型的默认值?

python - 将字典保存到文件 Python

python - 当文本已知时在音频文件中建立单词索引

python - 使用 Python C API 版本 2 和 3 的二进制文件

python - 仅对列表中的列表的字典值进行排序

python - 使用 matplotlib 绘制有限元网格的最有效方法?

c - 使用 fwrite 存储在文本文件中的数据在 C 中不可读