试图调用对象上的函数

2024-04-16 11:20:42 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我先向您展示我的代码,可能会更简单:

def use(self):
    target = self.requestTarget()
    target = str(target)
    exec(self.whatDoes+"("+target+")")

self.requestTarget返回player,一个对象。self.whatDoes"learnAttack"learnAttack()将一个对象作为其参数,并将一个项附加到目标的列表中。 当我运行此代码时,我得到错误:

learnAttack(<character object at 0x7fda68acf1d0>)
            ^
SyntaxError: invalid syntax

诚然,我本可以编写得更好,但我已经建立了一个完整的框架,修改代码会涉及到很多我懒得做的工作。你知道吗

很抱歉使用exec()。你知道吗


Tags: 对象代码selftarget目标列表参数use
3条回答

100次中的99.99次,exec/eval是错误的解决方案。你知道吗

Python函数(以及方法、类和模块FWIW)都是对象,因此如果您可以使self.whatDoes指向函数(或方法或任何可调用对象),那么您就不需要execeval-您只需将call操作符与预期参数一起应用,即:

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”应该是类的方法名,您可以使用getattr(obj,name)

首先使用eval创建函数并调用它。你知道吗

 def use(self):
   target = self.requestTarget()
   target = str(target)
   func = eval(self.whatDoes)
   func(target)

解决方案:用exec(self.whatDoes+"(target)")替换exec(self.whatDoes+"("+target+")"),并删除行target = str(target)

这里的问题是,当您到达第target = str(target)行时,所发生的是变量目标变成了字符串"<character object at 0x7fda68acf1d0>"。它不再引用原始对象,而是只引用那个字符串,它只是一个字符串。然后,当您的程序到达exec(self.whatDoes+"("+target+")")时,它会作为learnAttack(<character object at 0x7fda68acf1d0>)执行,这会导致明显的语法错误,因为运行时会在任何地方导致错误。在建议的修复之后,它执行learnAttack(target),目标仍然引用对象。你知道吗

相关问题 更多 >