Python从字符串生成函数名
我希望使用基于传入参数的字符串的函数,如下所示。代码给出以下错误:AttributeError:“Obj”对象没有属性“funA” funA和funB函数是在fun中定义的,因为它们只在fun中使用,而不在其他地方使用Python从字符串生成函数名,python,string,function,class,object,Python,String,Function,Class,Object,我希望使用基于传入参数的字符串的函数,如下所示。代码给出以下错误:AttributeError:“Obj”对象没有属性“funA” funA和funB函数是在fun中定义的,因为它们只在fun中使用,而不在其他地方使用 class Obj(object): def __init__(self): self.A = 2 self.B = 3 def fun(self, ar): def funA(self):
class Obj(object):
def __init__(self):
self.A = 2
self.B = 3
def fun(self, ar):
def funA(self):
print self.A
def funB(self):
x = self.B + 4
print self.B
for letter in ar:
name = 'fun' + letter
getattr(self, name)()
obj_instance = Obj()
obj_instance.fun(['A', 'B'])
我不推荐,但如果你真的需要它,那么你可以这样做:
class Obj(object):
def __init__(self):
self.A = 2
self.B = 3
def fun(self, ar):
def funA(self):
print self.A
def funB(self):
x = self.B + 4
print self.B
for letter in ar:
name = 'fun' + letter + '()'
exec(name)
obj_instance=Obj()
obj_instance.fun(['A', 'B'])
exec执行您放在括号中的任何字符串,就像它是python代码一样。您也可以尝试以下代码。它使您有机会检查函数是否存在
class Obj(object):
def __init__(self):
self.A = 2
self.B = 3
def fun(self, ar):
def funA():
print self.A
def funB():
x = self.B + 4
print self.B
print x
for letter in ar:
name = 'fun' + letter
if name in locals():
locals()[name]()
obj_instance = Obj()
obj_instance.fun(['A', 'B'])
问题不在于getattr调用,而在于函数本身。这些不是Obj实例的属性,而是fun中的局部变量。如果不需要多次调用函数和/或为了代码可读性,我不明白为什么要在函数中声明函数。此代码生成以下错误消息:TypeError:funA在给定Anks Tobias的情况下正好使用1个参数0。出于我的目的,你的代码运行得非常好。是否有理由使用if name in locals,why not just leave Is out?正如我所写的,这只是一个如何检查函数是否存在于本地作用域中的示例。你可以不说,但这不安全。例如,如果您尝试调用obj_instance.fun['A'、'B'、'C'],则会出现'C'的异常,因为您的本地作用域中没有funC。如果使用检查条件,则不会发生这种情况。