如何使用pickle()初始化实例?

Jua*_*vas 6 python

我想定义一个能够从另一个实例的序列化数据中读取自己的类.这是简化的代码:

class MyClass(list):

    def __init__(self,**kwargs):
        if kwargs.has_key('fdata'):
            f = open(kwargs['fdata'],'r')
            self = pickle.load(f)
            print len(self)    #prints 320          
            f.close()              

    ...

a = MyClass(fdata='data.dat')
print len(a)    #prints 0
Run Code Online (Sandbox Code Playgroud)

这是我获得的输出:

320
0
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是返回的实例总是空的,即使我能够读取内部的所有元素__init__()可能导致这种情况?

Sve*_*ach 4

分配给self方法内部只是将本地名称重新绑定self到不同的对象。Python 中对裸名称的赋值永远不能修改任何对象 \xe2\x80\x93,它们只是重新绑定名称。

\n\n

为什么不直接使用

\n\n
with open("data.dat") as f:\n    a = pickle.load(f)\n
Run Code Online (Sandbox Code Playgroud)\n\n

而不是构建一个新类?如果您不喜欢这样,请将其包装在函数中,但将此代码放入__init__().

\n\n

还有其他方法可以达到相同的效果。也许准确实现您想要的效果的最佳方法是在构造新实例之前__new__()覆盖而不是调用\ __init__()xe2\x80\x93 ,因此您可以简单地返回未腌制的实例,而不必修改已经构造的实例。__new__()

\n