[Tutor] how to shelve classes
Eike Welk
eike.welk at gmx.net
Fri Jun 18 15:16:36 CEST 2010
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.
More information about the Tutor
mailing list