You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现批量调用类方法时排除多个指定方法?

让method_runner支持排除多个方法的修改方案

我来帮你调整代码,实现批量排除指定方法的需求,具体思路和修改后的代码如下:

核心修改点

  1. 参数升级:把原来的单个skip_name参数改成支持传入多个方法名的skip_names,默认值设为空元组(避开可变默认参数的陷阱)。
  2. 判断逻辑优化:从判断“是否等于单个名称”改成“是否在排除列表中”,还可以把排除列表转成集合来提升查找速度。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:29:42