如何从字符串中获取对象?

时间:2013-02-19 22:14:57

标签: python string object serialization

说我有以下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的{​​{1}}表示形式存储到字符串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>>
>>> 

3 个答案:

答案 0 :(得分:4)

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

可以返回 __main__.Test的另一个实例,只要它的构造函数不接受任何参数,并再次查找该方法,但它将没有相同的内存地址。

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

答案 1 :(得分:1)

需要考虑几个陷阱:

  • Test的实例可能已存在或可能不存在
  • 该实例可能已被垃圾收集
  • 该实例可能具有函数monkey-patched Test.TestFunc
  • 可能在0xb771b28c
  • 创建了另一个对象

答案 2 :(得分: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