On Friday June 18 2010 12:22:26 Payal wrote:
> Hi,
> I want to carry my classes around, so I wrote foo.py as,
>
> #!/usr/bin/python
>
> import pickle, shelve
>
> f = shelve.open('movies')
>
> class F(object) :
> def __init__(self, amt) : self.amt = amt
> def dis(self) : print 'Amount : ', self.amt
> def add(self, na) :
> self.amt += na
> F.dis(self)
>
> f['k'] = F
> x=F(99)
> f['k2']=x
>
> Now in python interpreter I get,
>
> >>> import shelve
> >>> f = shelve.open('movies')
> >>> F2=f['k']
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "/usr/lib/python2.6/shelve.py", line 122, in __getitem__
> value = Unpickler(f).load()
> AttributeError: 'module' object has no attribute 'F'
>
> How do I carry around my classes and instances?
Classes don't really get pickled. Only a little bit of information describing
the class. The class definition has to be visible to the interpreter when a
class or one of its instances is unpickled.
Therefore you have to import the class first (IMHO, I didn't test anything):
from foo import F
import shelve
f = shelve.open('movies')
F2=f['k']
See:
http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled
"..., classes are pickled by named reference, so the same restrictions in the
unpickling environment apply. Note that none of the class’s code or data is
pickled, ..."
Eike.
_______________________________________________
Tutor maillist - [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor