擅长:python、mysql、java
<p>100次中的99.99次,<code>exec</code>/<code>eval</code>是错误的解决方案。你知道吗</p>
<p>Python函数(以及方法、类和模块FWIW)都是对象,因此如果您可以使<code>self.whatDoes</code>指向函数(或方法或任何可调用对象),那么您就不需要<code>exec</code>或<code>eval</code>-您只需将call操作符与预期参数一起应用,即:</p>
<pre><code>def fun(obj):
print(obj)
class Whatever(object):
pass
w = whatever()
w.whatDoes = fun
w.whatDoes(42)
</code></pre>
<p>如果需要<code>whatDoes</code>成为字符串,则构建一个<code>dict</code>允许的函数名->;函数并查找该dict:</p>
<pre><code>def fun(obj):
print(obj)
FUNCTIONS = {
"fun": fun,
# etc
}
class Whatever(object):
def requestTarget(self):
return 42
def use(self):
target = self.requestTarget()
func = FUNCTIONS[self.whatDoes]
return func(target)
w = Whatever()
w.whatDoes = "fun"
w.use()
</code></pre>
<p>哦,是的,如果“whatDoes”应该是类的方法名,您可以使用<code>getattr(obj,name)</code></p>