2013-02-19 71 views
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>> 
>>> 

現在我保存表示t.TestFuncPython表示爲字符串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

如果要將對象序列化爲字符串,請使用['pickle'](http://docs.python.org/2/library/pickle.html)。 – Bakuriu 2013-02-19 22:18:48

+1

你可以從'globals()'或者'gc.get_objects()'或者其他東西構建一個'id'字典,然後從中得到實例,然後使用'getattr'從實例中獲取方法,但是它會非常難看。 – DSM 2013-02-19 22:20:22

+0

這是一個重複的:http://stackoverflow.com/questions/14968349/textual-reference-of-a-method – JCash 2013-02-19 22:57:11

回答

4

你不能單獨使用字符串返回到同一個對象,因爲Python沒有給你一個通過內存地址查找對象的方法。

可以回去__main__.Test另一例如,提供它的構造函數不帶任何參數,並重新擡頭的方法,但它不會有相同的內存地址。

您必須爲其組件(模塊,類名稱和方法名稱)解析字符串,然後在各個組件上使用getattr(),將該類實例化爲過程的一部分。我懷疑這是你想要的。

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 
+1

再次閱讀。這不是問題,OP希望從str(t.TestFunc)回到t。另外,你對getattr(使用常量字符串)的使用比毫無意義的要糟糕。 – delnan 2013-02-19 22:25:35

1

有幾個陷阱需要考慮:

  • Test實例可能會或可能不會存在了
  • 實例可能已被垃圾回收
  • 實例可能有功能猴子補丁Test.TestFunc
  • 0xb771b28c可能已創建不同的對象
相關問題