选择要使用的实例方法
Choosing which instance method to use
我写了一些代码,它接受一堆对象,在每个对象上使用一个实例方法,并将实例方法返回的值放在一个列表中。
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
有没有一种优雅的方法来重构这个问题的代码?
从最好到最差,这些选项有效:
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))
怎么样:
def call_method(obj, method_name: str):
return getattr(obj, method_name)()
getattr
函数获取属性和return函数,最后一对表示函数调用。
我写了一些代码,它接受一堆对象,在每个对象上使用一个实例方法,并将实例方法返回的值放在一个列表中。
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
有没有一种优雅的方法来重构这个问题的代码?
从最好到最差,这些选项有效:
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))
怎么样:
def call_method(obj, method_name: str):
return getattr(obj, method_name)()
getattr
函数获取属性和return函数,最后一对表示函数调用。