6

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

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

这是我获得的输出:

320
0

我遇到的问题是返回的实例始终为空,即使我能够读取其中的所有元素__init__()可能导致这种情况的原因是什么?

4

2 回答 2

4

在方法内部赋值self只是将本地名称重新绑定self到不同的对象。Python 中对裸名称的赋值永远不能修改任何对象——它们只是重新绑定名称。

你为什么不直接使用

with open("data.dat") as f:
    a = pickle.load(f)

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

还有其他方法可以达到相同的效果。可能最好的方法是覆盖__new__()而不是__init__()-在构造新实例之前__new__()调用,因此您可以简单地返回未腌制的实例,而不必修改已经构造的实例。

于 2012-06-28T12:19:12.920 回答
3

self是 Python 中的常规局部变量。您不能使用self = other使对象“变成”其他东西,您只需重新分配本地对象。您必须一个一个地恢复属性,或者使用类似的东西:

self.__dict__ = pickle.load(f).__dict__

(我没有测试过最后一行,它很可能会让你的小猫爆炸。)

于 2012-06-28T12:17:29.803 回答