在文件中存储了序列化的类对象后,我想提供一个静态方法" Load"应该重新打开文件,反序列化对象并返回一个新实例。
经典,我会通过重载构造函数并传入所有必要的参数来解决这个问题。但是,这在Python中并不常见,而是采用以下方法:
Python class setup for serialization without pickle
当我在静态方法中反序列化对象时,没有" cls"到现在为止我还不知道如何管理它。总之,我希望有这样的行为:
x = Foo() # default constructor. All serializable data is created later on
# working with x and creating data
x.save("my_file.pkr")
y = Foo.Load(x)
load()
函数如下所示:
@staticmethod
def load(filename):
with open(filename, 'rb') as bin_object:
lst1 = pickle.load(bin_object)
lst2 = pickle.load(bin_object)
lst3 = pickle.load(bin_object)
lst4 = pickle.load(bin_object)
lst5 = pickle.load(bin_object)
# not possible as I already use the default constructor
return Foo(lst1, lst2, lst3, lst4, lst5)
有人可以透露我如何在静态加载方法中创建Foo的对象吗?我仍然想创建"空"只调用Foo()
。
答案 0 :(得分:1)
你被Java的做事方式误导了。
在Python中,有两个staticmethod
,它不带参数,classmethod
,它接受类。后者就是你想要的。
并且没有理由必须在构造函数中完成属性赋值,或者在初始化时完成。在初始化之后以及从实例外部分配属性是完全有效和惯用的。
@classmethod
def load(cls, filename):
with open(filename, 'rb') as bin_object:
...
foo = cls()
foo.lst1 = lst1
foo.lst2 = lst2
...
return foo