我想定义一个能够从另一个实例的序列化数据中读取自己的类.这是简化的代码:
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__()可能导致这种情况?
分配给self方法内部只是将本地名称重新绑定self到不同的对象。Python 中对裸名称的赋值永远不能修改任何对象 \xe2\x80\x93,它们只是重新绑定名称。
为什么不直接使用
\n\nwith open("data.dat") as f:\n a = pickle.load(f)\nRun Code Online (Sandbox Code Playgroud)\n\n而不是构建一个新类?如果您不喜欢这样,请将其包装在函数中,但将此代码放入__init__().
还有其他方法可以达到相同的效果。也许准确实现您想要的效果的最佳方法是在构造新实例之前__new__()覆盖而不是调用\ __init__()xe2\x80\x93 ,因此您可以简单地返回未腌制的实例,而不必修改已经构造的实例。__new__()