如何实现批量调用类方法时排除多个指定方法?
让
method_runner支持排除多个方法的修改方案 我来帮你调整代码,实现批量排除指定方法的需求,具体思路和修改后的代码如下:
核心修改点
- 参数升级:把原来的单个
skip_name参数改成支持传入多个方法名的skip_names,默认值设为空元组(避开可变默认参数的陷阱)。 - 判断逻辑优化:从判断“是否等于单个名称”改成“是否在排除列表中”,还可以把排除列表转成集合来提升查找速度。
修改后的完整代码
class SomeClass: def method_a(self): print('method_a') def method_b(self): print('method_b') def method_c(self): print('method_c') def method_runner(self, skip_names=()): # 处理用户可能传入单个字符串的情况,统一转成集合提升查找效率 skip_set = set(skip_names) if isinstance(skip_names, (list, tuple)) else {skip_names} # 遍历类中所有可调用的公开方法(过滤内置私有方法) for attr_name in dir(self): attr = getattr(self, attr_name) if callable(attr) and not attr_name.startswith('_'): if attr_name not in skip_set: attr()
怎么用?
# 实例化对象 obj = SomeClass() # 排除单个方法(兼容原有传参习惯) obj.method_runner(skip_names='method_a') # 排除多个方法,传入列表或元组都可以 obj.method_runner(skip_names=['method_a', 'method_c']) # 不排除任何方法,直接调用所有方法 obj.method_runner()
额外细节说明
- 用空元组做默认参数是因为列表是可变对象,如果用
skip_names=[]当默认值,多次调用方法时会残留之前传入的值,元组更安全。 - 加入
isinstance判断是为了兼容用户可能还按照老习惯传单个字符串的情况,不会报错,代码会自动处理成集合。 dir(self)会列出实例的所有属性,我们通过callable(attr)筛选出方法,再用not attr_name.startswith('_')过滤掉Python自带的私有方法(比如__init__),避免误调用。
内容的提问来源于stack exchange,提问作者Kade Williams
相关产品推荐
相关产品推荐

