gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:14 24 4
gpt4 key购买 nike

场景

我正在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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com