场景
我正在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)
如您所见 ComplexParam1
和ComplexParam2
是要计算的参数,不用于第一次创建对象 A
因为它们获取起来非常复杂,而EasyParam1
和EasyParam2
是“已知”参数。把它想象成 EasyParameters
是整数,ComplexParameters
是基于 EasyParameters
构建的大型矩阵
所以我使用上面的设置 Save
和Load
传入和传出文件的对象,其中 Create
自ComplexParam1
起使用构造函数和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/