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>>'
>>> 

さて、 string から関数ハンドルを取得できる方法はありますか<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 に答える