Python 试图调用对象上的函数

Python 试图调用对象上的函数,python,function,python-3.x,oop,Python,Function,Python 3.x,Oop,如果我先向您展示我的代码,这可能是最简单的: def use(self): target = self.requestTarget() target = str(target) exec(self.whatDoes+"("+target+")") self.requestTarget返回player,一个对象。self.whatDoes是learnatack。LearnAtack将对象作为其参数,并将一项附加到目标所拥有的列表中。 当我运行此代码时,我得到错误: lea

如果我先向您展示我的代码,这可能是最简单的:

def use(self):
    target = self.requestTarget()
    target = str(target)
    exec(self.whatDoes+"("+target+")")
self.requestTarget返回player,一个对象。self.whatDoes是learnatack。LearnAtack将对象作为其参数,并将一项附加到目标所拥有的列表中。 当我运行此代码时,我得到错误:

learnAttack(<character object at 0x7fda68acf1d0>)
            ^
SyntaxError: invalid syntax
诚然,我本可以编写得更好,但我已经建立了一个完整的框架,修改这段代码将涉及很多我懒得做的工作

很抱歉使用exec。

解决方案:将execself.whatDoes++target+替换为execself.whatDoes+target,并删除target=strtarget行


这里的问题是,当您到达行target=strtarget时,发生的情况是变量target变成字符串。然后它不再引用原始对象,而是引用该字符串,它只是一个字符串。然后,当您的程序到达execself.whatDoes++target+,然后作为learnatack执行,这会导致一个明显的语法错误,因为运行它会在任何地方导致错误。使用建议的修复程序,然后执行learnatacktarget,目标仍然引用对象。

使用eval首先创建函数并调用它

 def use(self):
   target = self.requestTarget()
   target = str(target)
   func = eval(self.whatDoes)
   func(target)
百分之九十九点九九,exec/eval是错误的解决方案

Python函数以及方法、类和模块FWIW都是对象,因此如果您可以使self.whatDoes指向函数、方法或任何可调用对象,则不需要exec或eval-您只需使用预期参数应用调用运算符即可,即:

def fun(obj):
    print(obj)

class Whatever(object):
    pass

w = whatever()
w.whatDoes = fun

w.whatDoes(42)
如果需要将whatDoes设置为字符串,则构建允许的函数名->函数的dict并查找该dict:

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

哦,是的,如果whatDoes应该是类的方法名,您可以使用getattrobj,name

将什么传递给例程?对象上的str可能会返回此类输出,除非您定义了_ustr_uuu方法。您到底为什么要使用exec进行此操作?@JimFasarakis Hilliard XY问题再次出现。使self.whatDoes=learnAttack函数,而不是字符串。然后self.whatDoestarget等同于learnatacktarget您应该创建字典函数[learnatack]=learnatack,然后您不需要exec,只需要函数[self.whatDoes]target。然后,您不必将目标转换为字符串,这样就不会对SyntaxError有任何问题。理想情况下,但这家伙说他不想更改其他内容,所以这至少是一个解决方案