在Python 3中挑选一个未绑定的方法

时间:2010-05-28 16:32:38

标签: python methods python-3.x pickle

我想在Python 3.x中挑选一个未绑定的方法。我收到了这个错误:

>>> class A:
...     def m(self):
...         pass
>>> import pickle
>>> pickle.dumps(A.m)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    pickle.dumps(A.m)
  File "C:\Python31\lib\pickle.py", line 1358, in dumps
    Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
_pickle.PicklingError: Can't pickle <class 'function'>: attribute lookup builtins.function failed

有没有人有这方面的经验?


注意:在Python 2.x中,默认情况下也不可能挑选未绑定的方法;我设法以一种奇怪的方式在那里做到我不明白:我为MethodType类编写了一个带有copy_reg模块的reducer,它涵盖了绑定和非绑定方法。但是reducer只解决了绑定方法的情况,因为它依赖于my_method.im_self。神奇的是它也使Python 2.x能够腌制未绑定的方法。这不会发生在Python 3.x上。

1 个答案:

答案 0 :(得分:7)

这不能直接完成,因为在Python 3中,未绑定的方法类型消失了:它只是一个函数:

>>> print (type (A.m))
<class 'function'>

Python函数没有绑定到类,因此仅通过查看表达式结果就不可能分辨出A.m类属于哪个类。

根据您的具体需要,对(类,方法名称)元组进行pickle / unpickling可能就足够了:

>>> print (pickle.loads (pickle.dumps ((A, 'm'))))
... (<class '__main__.A'>, 'm')

您只需使用getattr()

即可从此处获取方法(功能)
>>> cls, method = pickle.loads (pickle.dumps ((A, 'm')))
>>> print (getattr (cls, method))
... <function m at 0xb78878ec>