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

您无需在一个真实名称下定义一个函数。函数是一流的实体,您可以传递它们并分配给变量。在顶层,您可以使用与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 回答