从静态方法中对序列化对象进行实例化

时间:2015-06-16 17:07:57

标签: python

在文件中存储了序列化的类对象后,我想提供一个静态方法" 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()

1 个答案:

答案 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