I want to define a class that is able to populate itself reading from the serialized data of another instance. Here's the simplified code:
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
This is the output I obtain:
320
0
The problem I have is that the instance returned is always empty, even though I am able to read all the elements inside __init__() What can be causing this?
Assigning to self inside a method simply rebinds the local name self to a different object.  Assignments to bare names in Python can never modify any object – they just rebind names.
Why don't you use the straight-forward
with open("data.dat") as f:
    a = pickle.load(f)
instead of constructing a new class?  If you don't like this, wrap this in a function, but it's not that useful to put this code into __init__().
There are other ways to achieve the same effect.  Probably the best way to achieve exactly what you are trying is to overwrite __new__() instead of __init__() – __new__() is called before the new instance is constructed, so you can simply return the unpickled instance instead of having to modify an already constructed one.
self is a regular local variable in Python. You can't use self = other to make an object "become" something else, you'll just reassign the local. You'll have to restore the attributes one-by-one, or use something like:
self.__dict__ = pickle.load(f).__dict__
(I haven't tested that last line, it might well make your kittens explode.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With