我正在尝试根据传入的字符串调用类中的函数。
我尝试按照此链接中的步骤操作: 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)
我得到错误:
AttributeError:fleet instance has no attribute 'methodToCall'
关于为什么 methodToCall 没有被分配给我正确的方法名称有什么想法吗?
我也试过
methodToCall = getattr(fleet, methodToCall)
然后我收到消息:
AttributeError: 'module' object has no attribute 'addCruiser'
好像 getattr 在我的类中找不到我的方法。
listOfPlayerFleets 是舰队对象列表
这是 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
请您参考如下方法:
您的 methodToCall 变量是一个绑定(bind)方法,这意味着您不需要在对象上调用它——它知道它将被调用的对象。例如,fleet.addFighter 是一个未绑定(bind)的方法。打印 repr(methodToCall) 和 repr(fleet.addFighter) 应该清楚这一点。
你应该使用这个:
methodNameString = "add" + typeOfShip
methodToCall = getattr(listOfPlayerFleets[currentPlayer], methodNameString)
methodToCall(num)
