4

文字列「unpredictable_words」を含むファイルがあるとします。この文字列を読み込んで、次のように関数を定義したいと思います。

def test_unpredictable_words(self):
    do_important_stuff()

次に、この関数をクラス定義に挿入して、この関数をこのクラスの任意のインスタンスで呼び出すことができるようにします。

どうすればこれを達成できますか?

私はこの答えを少し見ました - https://stackoverflow.com/a/8160676/1701170 - しかし、それが私が望むことを正確に行うとは思わないか、少なくとも何が起こっているのか理解できません。

4

2 に答える 2

5
Python 2.7.3 (default, Sep 26 2012, 21:51:14) 
>>> def injected(self):
...     print 'injected'
... 
>>> class A(object):
...     pass
... 
>>> A.injected = injected
>>> a = A()
>>> a.injected()
injected
>>> def func2(self):
...     print 'func2'
... 
>>> setattr(A, 'injected2', func2)
>>> a.injected2()
func2
>>> 
于 2012-12-29T03:08:04.987 に答える
3

1 つの真の名前で関数を定義する必要はありません。関数は第一級の実体であり、関数を渡したり、変数に代入したりできます。トップレベルではglobals()、別の関数とともにを使用locals()して、名前をバインドします。

>>> def foo(x):
...   return x + 1
... 
>>> name = 'unpredictable_words'
>>> 
>>> globals()['test_' + name] = foo
>>> 
>>> test_unpredictable_words(1)
2
>>> 
>>> def some_function():
...   locals()['test_' + name] = foo
...   return test_unpredictable_words(1)
... 
>>> some_function()
2
>>> 

スタックトレースにうまく表示されるように、関数にその名前を知ってもらいたい場合があります。エラーメッセージのようにtest_unpredictable_words表示されるようになりました。fooその名前は に保存されfoo.func_code.co_name、変更できないため、これを修正するのは簡単ではありません。

于 2012-12-29T03:55:04.667 に答える