Python从字符串生成函数名

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):

我希望使用基于传入参数的字符串的函数,如下所示。代码给出以下错误: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):
            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。如果使用检查条件,则不会发生这种情况。