选择要使用的实例方法

时间:2016-05-24 14:44:56

标签: python python-3.x refactoring instance-methods

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

object_list # list of objects
value_list = [object.method() for obj in object_list]

我需要在我的代码中的许多不同位置使用此结构,它们之间的唯一区别是实例方法method总是不同的。

如果方法是函数,使用mapping approach as explained here将没有问题。可以使用exec做类似的事情,但它不是很优雅,而且我不确定如何返回值:

def call_method(obj, method_name: str):
    return exec("obj." + method_name + "()")  # returns None

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

2 个答案:

答案 0 :(得分:4)

从最佳到最差,这些选项都有效:

getattr(obj, method_name)()
operator.methodcaller(method_name)(obj)  # needs import operator
eval("obj." + method_name + "()")

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

value_list = list(map(operator.methodcaller(method_name), object_list))

答案 1 :(得分:1)

怎么样:

def call_method(obj, method_name: str):
    return getattr(obj, method_name)()

getattr函数获取属性并返回函数,最后一对表示函数调用。