无法使用字符串调用函数

2024-10-01 17:23:21 发布

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

我试图根据传入的字符串调用类中的函数。在

我试着按照以下步骤操作: Calling a function of a module from a string with the function's name in Python

这是我的代码:

methodNameString = "add" + typeOfShip
methodToCall = getattr(listOfPlayerFleets[currentPlayer], methodNameString)

listOfPlayerFleets[currentPlayer].methodToCall(num)

我得到了一个错误:

^{pr2}$

你知道为什么methodToCall没有被指定正确的方法名吗?在

我也试过了

methodToCall = getattr(fleet, methodToCall)

然后我得到信息:

AttributeError: 'module' object has no attribute 'addCruiser'

好像getattr在我的类中找不到我的方法。在

playerFleets列表是舰队对象的列表

下面是fleet对象的样子,您可以看到这些方法确实存在。在

class fleet:
    """ Stores Fleet Numbers, Represents a fleet """

    ships = {'fighters':0, 'cruisers':0, 'capitols':0}
    attacking = False
    defending = False

    def __init__(self):
        self.ships = {'fighters':0, 'cruisers':0, 'capitols':0}
        self.attacking = False
        self.defending = False

    #add a Fighter
    def addFighter(self, numOfFighters):
        self.ships['fighters'] = numOfFighters


    #add a Cruiser
    def addCruiser(self, numOfCruisers):
        self.ships['cruisers'] = numOfCruisers

    #add a Capitol Ship
    def addCapitol(self, numOfCapitols):
        self.ships['capitols'] = numOfCapitols

Tags: 方法selfaddfalsedeffunctionmodulegetattr
3条回答

首先,这类事情很少能与正确的解决方案相媲美,例如使用字典,甚至很少比那些更好。你应该有一个方法addShip(kind, num),它只做self.ships[kind] += num。更清洁,更容易延长,干燥(不要重复你自己),作为额外的奖励也更快。在

至于错误:listOfPlayerFleets[currentPlayer].methodToCall(num)试图调用名为methodToCall(显然不存在)的方法。getattr(listOfPlayerFleets[currentPlayer], methodNameString)已经为您提供了所需的方法,它是一个绑定方法,即当您调用methodToCall()时,右self被传递。在

另一个错误('method' object has no ...)是因为模块和其中包含的内容(例如类)之间存在差异。我假设class fleet在一个名为^{的模块中?那么你需要fleet.fleet。顺便说一下,类应该在CamelCase中命名-请参阅样式指南PEP 8。在

您的methodToCall变量是一个绑定方法,这意味着您不需要在对象上调用它——它知道将调用它的对象。^例如,{}是一个未绑定的方法。打印repr(methodToCall)和{}应该可以清楚地说明这一点。在

你应该使用这个:

methodNameString = "add" + typeOfShip
methodToCall = getattr(listOfPlayerFleets[currentPlayer], methodNameString)

methodToCall(num)

那应该行了。在

methodNameString = "add" + typeOfShip
methodToCall = getattr(listOfPlayerFleets[currentPlayer], methodNameString)

methodToCall(num)

getattr为您提供了对特定实例(listOfPlayerFleets[currentPlayer])的方法的引用,因此只需使用参数调用它。在

相关问题 更多 >

    热门问题