gpt4 book ai didi

python - Python 2.7 中使用方法名称字符串的动态方法调用

转载 作者:太空狗 更新时间:2023-10-29 17:24:29 26 4
gpt4 key购买 nike

我有一个元组,其中列出了类的方法,例如:

t = ('methA','methB','methC','methD','methE','methF')

等等..

现在我需要根据用户所做的选择动态调用这些方法。将根据索引调用这些方法。因此,如果用户选择“0”,则调用 methA,如果选择“5”,则调用 methF

我的方法如下:

def makeSelection(self, selected):
#methodname = t[selected]
#but as this is from within the class , it has to be appended with 'self.'methodname
# also need to pass some arguments locally calculated here

我已经设法用 eval 解决了一些问题,但它会产生错误并且一点也不优雅。

最佳答案

如果您在对象(包括导入的模块)上调用方法,您可以使用:

getattr(obj, method_name)(*args) #  for this question: use t[i], not method_name

例如:

>>> s = 'hello'
>>> getattr(s, 'replace')('l', 'y')
'heyyo'

如果需要调用当前模块中的函数

getattr(sys.modules[__name__], method_name)(*args)

其中 args 是要发送的参数列表或元组,或者您可以像对待任何其他函数一样在调用中列出它们。由于您在尝试调用同一对象上的另一个方法的方法中,请使用第一个 self 代替 obj

getattr接受一个对象和一个字符串,并在对象中查找属性,如果属性存在则返回该属性。 obj.xgetattr(obj, 'x') 实现相同的结果。如果您想进一步研究这种反射,还有 setattrhasattrdelattr 函数。



一种完全不同的方法:
在注意到这个答案受到的关注之后,我将建议一种不同的方法来处理你正在做的事情。我假设存在一些方法

def methA(*args): print 'hello from methA'
def methB(*args): print 'bonjour de methB'
def methC(*args): print 'hola de methC'

为了使每个方法对应一个数字(选择),我构建了一个字典,将数字映射到方法本身

id_to_method = {
0: methA,
1: methB,
2: methC,
}

鉴于此,id_to_method[0]() 将调用 methA。它分为两部分,首先是 id_to_method[0] 从字典中获取函数对象,然后是 () 调用它。我还可以传递参数 id_to_method[0]("whatever", "args", "I", "want)在您的真实代码中,鉴于以上内容,您可能会有类似的东西

choice = int(raw_input('Please make a selection'))
id_to_method[choice](arg1, arg2, arg3) # or maybe no arguments, whatever you want

关于python - Python 2.7 中使用方法名称字符串的动态方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17734618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com