【发布时间】:2013-02-04 18:54:24
【问题描述】:
假设我有以下class
class Test:
def TestFunc(self):
print 'this is Test::TestFunc method'
现在,我创建了class Test 的一个实例
>>>
>>> t = Test()
>>>
>>> t
<__main__.Test instance at 0xb771b28c>
>>>
现在,t.TestFunc 表示如下
>>>
>>> t.TestFunc
<bound method Test.TestFunc of <__main__.Test instance at 0xb771b28c>>
>>>
现在我将t.TestFunc 的Python 表示形式存储到字符串string_func
>>>
>>> string_func = str(t.TestFunc)
>>> string_func
'<bound method Test.TestFunc of <__main__.Test instance at 0xb771b28c>>'
>>>
现在,有没有办法从字符串<bound method Test.TestFunc of <__main__.Test instance at 0xb771b28c>> 中获取函数句柄。例如,
>>>
>>> func = xxx(string_func)
>>> func
<bound method Test.TestFunc of <__main__.Test instance at 0xb771b28c>>
>>>
【问题讨论】:
-
如果要将对象序列化为字符串,请使用
pickle。 -
您可以从
globals()或gc.get_objects()或其他东西构建一个id字典,然后从中获取实例,然后使用getattr从实例中获取方法,但是它会非常难看。 -
这里的实际用例是什么?这闻起来像XY problem。如果你有一种神奇的方法可以从绑定方法
reprs 回到原来的绑定方法(甚至以某种方式解决了绑定实例不再存在等明显问题……),你会用它做什么? -
如果您只是想在执行
f = t.TestFunc之类的操作后从f获取t和TestFunc,这很容易。 (在 3.x 中是f.__self__和f.__func__,在 2.x 中是f.im_self和f.im_func。)因此,如果您尝试使用repr作为获取该信息的复杂方式,您'做错了。
标签: python string object serialization