当前位置: 首页 > 面试题库 >

使用方法名称字符串在Python 2.7中进行动态方法调用

陆正德
2023-03-14
问题内容

我有一个元组,列出了像这样的类的方法:

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


 类似资料:
  • 类的每个实例都有一个类的实例。应该根据其成员变量调用中的不同方法。这是一个实现,做我想要的: 但是,我希望能够以某种方式直接传递B的方法1或方法2,而不是执行myA.method_num=1。我怎么能那样做?

  • 问题内容: 如果我有两个变量: 在不知道的类的情况下obj,如何调用由其标识的方法methodName? 被调用的方法没有参数,并且有String返回值。 问题答案: 参数标识你需要的非常特定的方法(如果有多个重载可用,如果该方法没有参数,则仅给出methodName)。 然后,你通过调用该方法 同样,.invoke如果没有,请忽略中的参数。

  • 本文向大家介绍JavaScript 动态方法名称,包括了JavaScript 动态方法名称的使用技巧和注意事项,需要的朋友参考一下 示例 在命名方法时也可以评估表达式,类似于使用可以访问对象属性的方法[]。这对于具有动态属性名称很有用,但是通常与符号结合使用。            

  • 问题内容: 如何通过反射找出方法的字符串名称是什么? 例如给出: 我想获取字符串“ getFoo”,如下所示: 问题答案: 由于方法本身不是对象,因此它们没有直接的属性(就像您希望使用JavaScript之类的一流函数那样)。 您能做的最接近的是致电 是一个对象,您可以使用它调用任何反射方法。 但是,据我所知,一种方法无法识别自己。

  • 问题内容: 像这样:类具有一个称为sayHello()的方法。当该类的实例调用sayHello()时,另一个类中的方法会在调用sayHello()之前自动调用。 示例代码可以像这样: 输出结果: 似乎可以通过使用代理模式来完成。但我希望它可以更简单。 使用注释: 然后将MethodListener注释放在Person类中的方法sayHello()上, 调用具有MethodListener批注的方法

  • 问题内容: Python:如何在被调用方法中获取调用者的方法名称? 假设我有2种方法: 如果我不想对method1进行任何更改,如何在method2中获取调用者的名称(在本示例中,名称为method1)? 问题答案: inspect.getframeinfo和其他相关功能可以帮助: 该自省旨在帮助调试和开发;建议不要将其用于生产功能。