不带pickle的序列化Python类设置 脚本
我正在寻找一种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
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参数,它可以很好地处理继承