0

说我有以下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>>
>>> 

现在我将Python表示存储t.TestFunc到一个字符串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>>
>>> 
4

3 回答 3

4

您不能单独使用字符串返回同一个对象,因为 Python 没有提供通过内存地址查找对象的方法。

如果它的构造函数不带任何参数,您可以返回另一个实例__main__.Test,然后再次查找该方法,但它不会具有相同的内存地址。

您必须解析字符串的组件(模块、类名和方法名),然后getattr()在各种组件上使用,将类作为流程的一部分进行实例化。我怀疑这是你想要的。

于 2013-02-19T22:23:23.097 回答
1

有几个陷阱需要考虑:

  • Test可能或可能不再存在的实例
  • 该实例可能已被垃圾收集
  • 该实例可能具有猴子修补功能Test.TestFunc
  • 可能已创建不同的对象0xb771b28c
于 2013-02-19T22:22:23.250 回答
0

您可以使用getattr

    In [1]:
    class Test:
        def TestFunc(self):
            print 'this is Test::TestFunc method'

    In [2]: t = Test()

    In [3]: getattr(t, 'TestFunc')
    Out[3]: <bound method Test.TestFunc of <__main__.Test instance at 0xb624d68c>>

    In [4]: getattr(t, 'TestFunc')()
    this is Test::TestFunc method
于 2013-02-19T22:19:58.473 回答