pickle and instancemethod objects
Steven Bethard
steven.bethard at gmail.com
Wed Sep 13 13:06:03 EDT 2006
Martin v. Löwis wrote:
> Steven Bethard schrieb:
>> Does this approach seem sound? Am I going to run into some weird
>> problems doing it this way?
>
> It's good, but I think rebuilding the object through
> new.instancemethod should be even better.
>
> py> class A:
> ... def f(self):print "A"
> ...
> py> class B(A):
> ... def f(self):print "B"
> ...
> py> b=B()
> py> b.f
> <bound method B.f of <__main__.B instance at 0xa7d728cc>>
> py> x = new.instancemethod(A.__dict__['f'], b, A)
> py> x
> <bound method A.f of <__main__.B instance at 0xa7d728cc>>
> py> x()
> A
> py> b.f()
> B
> py> x.im_func.__name__,x.im_class,x.im_self
> ('f', <class __main__.A at 0xa7d7002c>, <__main__.B instance at 0xa7d728cc>)
>
> On unpickling x, you'ld get x.(B.f), not x.(A.f) with your
> approach.
>
> Not sure it matters much.
Probably doesn't matter for my particular use, but it certainly wouldn't
hurt to do it the careful way. Thanks.
Is new.instancemethod basically equivalent to calling __get__? That is,
would the following two unpickle_instancemethod functions do the same thing?
def unpickle_instancemethod(func_name, cls, obj):
return cls.__dict__[func_name].__get__(obj, cls)
def unpickle_instancemethod(func_name, cls, obj):
return new.instancemethod(cls.__dict__[func_name], obj, cls)
Thanks again,
STeVe
More information about the Python-list
mailing list