Skip to main content
 首页 » 编程设计

python之无法使用字符串调用函数

2025年05月04日31shanyou

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

我尝试按照此链接中的步骤操作: 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)