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

如何通过字符串输入调用类内方法(不使用函数字典)

解决方案:用getattr()动态调用类方法

Python内置的getattr()函数就是干这个的——直接根据字符串获取类实例的方法,完全不用维护函数字典,刚好适配你这种有几十上百个方法的场景,省得你一个个往字典里加。

具体代码示例

先保留你的类结构(新增方法直接往里加就行):

class Myclass():
    def __init__(self, df):
        self.df = df  # 把传入的df存到实例属性,方便方法内部调用

    def function_1(self, **kwargs):
        # 这里写你的业务处理逻辑
        return f"执行function_1,处理的数据框形状:{self.df.shape}"
    
    def function_2(self, **kwargs):
        return f"执行function_2,处理的数据框行数:{self.df.shape[0]}"
    # ... 剩下50多个方法直接追加到类中即可

然后是核心调用逻辑:

# 模拟前端传入的方法名字符串
receive = "function_1"  # 替换成你的Input()实际返回值

# 先创建类实例
my_obj = Myclass(df)  # df是你的目标数据框对象

# 用getattr获取方法并执行
try:
    # 根据字符串拿到对应的方法对象
    target_func = getattr(my_obj, receive)
    # 调用方法,需要传参就直接加**kwargs
    result = target_func(**your_kwargs)  # your_kwargs是你要传递的参数集合
    print(result)
except AttributeError:
    # 处理用户输入不存在的方法的情况
    print(f"出错了:找不到名为{receive}的方法")

额外提示:加个安全过滤

怕用户输入类的内置方法(比如__init__、__del__)搞出问题?可以加个白名单过滤,只允许调用指定前缀的方法:

# 筛选出允许调用的方法(比如只认以function_开头的)
allowed_funcs = [
    name for name in dir(my_obj) 
    if name.startswith("function_") and callable(getattr(my_obj, name))
]

if receive not in allowed_funcs:
    print(f"禁止调用:方法{receive}不在允许列表里")
else:
    target_func = getattr(my_obj, receive)
    result = target_func(**your_kwargs)

这种方式的最大优势是:后续新增方法完全不用修改调用逻辑,直接在类里加方法就行,彻底省去维护方法映射的麻烦。

内容的提问来源于stack exchange,提问作者ShanN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:57:37