选择要使用的实例方法

Gec*_*tar 1 python refactoring instance-methods python-3.x

我写了一些代码,它接受一堆对象,在每个对象上使用一个实例方法,并将实例方法返回的值放在一个列表中。

object_list # list of objects
value_list = [object.method() for obj in object_list]
Run Code Online (Sandbox Code Playgroud)

我在代码的很多不同地方都需要这种结构,它们之间的唯一区别是实例方法method总是不同的。

如果方法是函数,那么使用这里解释映射方法是没有问题的。可以用 做类似的事情exec,但是它不是很优雅,而且我不确定它在返回值方面如何工作:

def call_method(obj, method_name: str):
    return exec("obj." + method_name + "()")  # returns None
Run Code Online (Sandbox Code Playgroud)

有没有一种优雅的方法来重构这个问题的代码?

Ale*_*all 5

从最好到最坏,这些选项都有效:

getattr(obj, method_name)()
operator.methodcaller(method_name)(obj)  # needs import operator
eval("obj." + method_name + "()")
Run Code Online (Sandbox Code Playgroud)

第二个版本也可以这样使用:

value_list = list(map(operator.methodcaller(method_name), object_list))
Run Code Online (Sandbox Code Playgroud)