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

Ram*_*hum 9 python methods pickle python-3.x

我想在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
Run Code Online (Sandbox Code Playgroud)

有任何人对此有经验吗?


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

dou*_*lep 7

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

>>> print (type (A.m))
<class 'function'>
Run Code Online (Sandbox Code Playgroud)

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

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

>>> print (pickle.loads (pickle.dumps ((A, 'm'))))
... (<class '__main__.A'>, 'm')
Run Code Online (Sandbox Code Playgroud)

您只需使用getattr()以下命令即可从此处获取方法(函数):

>>> cls, method = pickle.loads (pickle.dumps ((A, 'm')))
>>> print (getattr (cls, method))
... <function m at 0xb78878ec>
Run Code Online (Sandbox Code Playgroud)

  • 是.尝试声明两个类并将一个方法从一个分配给另一个(`Bm = Am`).然后`Bm`和'Am`将是相等的(实际上是相同的),因此无法判断你是否在"B"或"A"中查找方法. (4认同)