Overcoming Python's limitations regarding instance methods

后端 未结 3 1549
孤城傲影
孤城傲影 2020-12-18 00:37

It seems that Python has some limitations regarding instance methods.

  1. Instance methods can\'t be copied.
  2. Instance methods can\'t be pickled.
相关标签:
3条回答
  • 2020-12-18 01:23

    pickle the instance and then access the method after unpickling it. Pickling a method of an instance doesn't make sense because it relies on the instance. If it doesn't, then write it as an independent function.

    import pickle
    
    class A:
         def f(self):
             print 'hi'
    
    x = A()
    f = open('tmp', 'w')
    r = pickle.dump(x, f)
    f.close()
    f = open('tmp', 'r')
    pickled_x = pickle.load(f)
    pickled_x.f()
    
    0 讨论(0)
  • 2020-12-18 01:27

    REST - Representation State Transfer. Just send state, not methods.

    To transfer an object X from A to B, we do this.

    1. A encode the state of X in some handy, easy-to-parse notation. JSON is popular.

    2. A sends the JSON text to B.

    3. B decodes the state of X form JSON notation, reconstructing X.

    B must have the class definitions for X's class for this to work. B must have all functions and other class definitions on which X's class depends. In short, both A and B have all the definitions. Only a representation of the object's state gets moved around.

    See any article on REST.

    http://en.wikipedia.org/wiki/Representational_State_Transfer

    http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

    0 讨论(0)
  • 2020-12-18 01:37

    You might be able to do this using copy_reg.pickle. In Python 2.6:

    import copy_reg
    import types
    
    def reduce_method(m):
        return (getattr, (m.__self__, m.__func__.__name__))
    
    copy_reg.pickle(types.MethodType, reduce_method)
    

    This does not store the code of the method, just its name; but that will work correctly in the common case.

    This makes both pickling and copying work!

    0 讨论(0)
提交回复
热议问题