不带pickle的序列化Python类设置 脚本

不带pickle的序列化Python类设置 脚本,python,oop,file-io,constructor,Python,Oop,File Io,Constructor,我正在寻找一种python中的面向对象方法,它可以将类的实例保存在数据文件中,并在稍后的时间点再次加载。我目前的做法如下: class A(object): def __init__(self, ComplexParam1, ComplexParam2): self.ComplexParam1 = ComplexParam1 self.ComplexParam2 = ComplexParam2 @staticmethod def Crea

我正在寻找一种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

因此,我使用上面的设置将
保存
加载
对象到文件,其中
创建
使用构造函数,因为
ComplexParam1
ComplexParam2
存储在文件中,不需要再次计算

问题 到目前为止,上面所示的方法对我来说还不错。但是,当此方案也用于类继承时,会出现问题。因此,我正在寻找一个更好、更干净的方法来解决我的问题

在C++中,我将重载构造函数,并使类可用的两种可能的创建,但在Python中不支持。
任何帮助、链接和建议都将不胜感激。

我认为这是装饰师的一个案例。例如,如果将
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。例如,如果将
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.。\uu init_uuu

在不需要重载的情况下,只需使用
classmethod
作为替代构造函数方法。看看这些答案

class A (object):

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

通过为类使用cls参数,它可以很好地处理继承。

在不需要重载的情况下,只需使用
classmethod
作为替代构造函数方法。看看这些答案

class A (object):

    @classmethod
    def Load(cls, Filename):
        #read ComplexParam1 and ComplexParam2 and call constructor
        return cls(ComplexParam1, ComplexParam2)
通过为类使用cls参数,它可以很好地处理继承