首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从静态方法中对序列化对象进行即时访问

从静态方法中对序列化对象进行即时访问
EN

Stack Overflow用户
提问于 2015-06-16 17:07:56
回答 1查看 517关注 0票数 0

在将序列化的类对象存储在文件中之后,我想提供一个静态方法"Load“,它应该重新打开文件,反序列化对象并返回一个新的实例。

传统上,我会通过重载构造函数来处理这个问题,并传递所有必要的参数。但是,这在Python中并不常见,而是可以采用以下方法:

Python class setup for serialization without pickle

当我在静态方法中反序列化对象时,没有"cls“,到目前为止我还不知道如何管理它。总之,我希望有这样一种行为:

代码语言:javascript
复制
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()函数如下所示:

代码语言:javascript
复制
    @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()来创建“空”对象。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-16 17:18:15

你被Java的做事方式误导了。

在Python中,有staticmethod (不带参数)和classmethod (接受类)。后者是你想要的。

没有理由必须在构造函数中完成属性赋值,或者在初始化时完成。初始化后并从实例外部分配属性是完全有效和惯用的。

代码语言:javascript
复制
@classmethod
def load(cls, filename):
    with open(filename, 'rb') as bin_object:
        ...
    foo = cls()
    foo.lst1 = lst1
    foo.lst2 = lst2
    ...
    return foo
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30873908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档