本篇文章主要介绍:如何将通过方法名/函数名(str 类型),实现对该函数/方法的调用。以下将从:场景、实现、方法原理三个方面进行说明。另外,方法和函数大致上是相同的,只是函数是一段代码,通过名字来进行调用,方法也是一段代码,也通过名字来进行调用,但它跟一个对象相关联
在一些代码编写场景中,我们可能会遇到这样:
class SendMessage():
...
_hanler_map_items = [
dict(type_name="修改密码", type_value=1, handler="_modify_password_handler"),
dict(type_name="重置密码", type_value=2, handler="_reset_password_handler")
]
def send(self, type_value: int) -> None:
pass
def _modify_password_handler(self, *args, **kwargs) -> None:
pass
def _reset_password_handler(self, *args, **kwargs) -> None:
pass
我定义了一个类 SendMessage
,这个类中,我定义了统一的调用界面 send
,在类属性中,我定义了_hanler_map_items
这样一个映射列表,这个列表的目的就是根据不同的 type_value
映射到对应的 handler
handler
的 value
是不可以直接选择方法(self._modify_password_handler),因为代码执行时,一行一行加载,此时方法没有加载,就会报错,因此,写上方法名,但是方法名是字符串,不可以直接调用
from operator import methodcaller
handler_name = "_modify_password_handler"
handler_func = methodcaller(handler_name, *args, **kwargs)
handler_func(self)
handler_name = "_modify_password_handler"
handler_func = getattr(self, handler_name)
handler_func(self, *args, **kwargs)
函数场景类似,
function_names = ["foo", "bar"]
def foo():
print("foo")
def bar():
print("bar")
for function in function_names:
function()
for function_name in function_names:
function = eval(function_name)
function()
# foo
# bar
for function_name in function_names:
function = locals()[function_name]
function()
# foo
# bar
for function_name in function_names:
function = globals()[function_name]
function()
# foo
# bar
methodcaller 函数的定义可以理解为:
def methodcaller(function_name, *args, **kwargs):
def caller(obj):
return getattr(obj, function_name)(*args, **kwargs)
return caller
可以看到这是一个闭包,返回的是一个可以调用的函数对象函数,并且可以传递参数给最终要调用的方法
原文:https://www.cnblogs.com/chaosmoor/p/14823361.html