Python中如何使用查找表调用类的实例方法?
问题描述
现有Python类定义:
class MyClass: def func_a(self): """do a""" def func_b(self): """do b"""
以及存在错误的映射关系:
mapping = { "A": lambda: Myclass.do_a, "B": lambda: Myclass.do_b }
希望实现以下逻辑:遍历列表["A", "B"]时,依次调用实例thing的func_a和func_b方法:
thing = Myclass() for i in ["A", "B"]: # 调用thing对应的方法
解决方案
原映射的核心问题
- 类名拼写错误:Python大小写敏感,
Myclass应改为MyClass - 未绑定方法问题:原lambda返回的是类的未绑定方法,无法直接通过实例调用,需要手动传入实例参数,不够直观。
推荐实现方式(灵活简洁)
直接将映射改为方法名字符串,结合getattr()获取实例的绑定方法并调用:
class MyClass: def func_a(self): """do a""" print("执行func_a") # 增加打印便于验证 def func_b(self): """do b""" print("执行func_b") # 映射存储方法名的字符串 mapping = { "A": "func_a", "B": "func_b" } thing = MyClass() for key in ["A", "B"]: # 获取实例对应的方法并调用 method = getattr(thing, mapping[key]) method()
另一种实现(保留lambda风格)
如果希望保留lambda的写法,可以让lambda接收实例参数并直接调用方法:
class MyClass: def func_a(self): """do a""" print("执行func_a") def func_b(self): """do b""" print("执行func_b") # 调整lambda为接收实例参数的形式 mapping = { "A": lambda inst: inst.func_a(), "B": lambda inst: inst.func_b() } thing = MyClass() for key in ["A", "B"]: mapping[key](thing)
执行结果
两种方案运行后都会输出:
执行func_a 执行func_b
内容的提问来源于stack exchange,提问作者bayerb
相关产品推荐
相关产品推荐

