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

重写__getattribute__处理Titles类方法,如何传入rules变量?

实现统一格式化的标题生成类

嘿,这个需求完全可行!你可以通过__getattribute__拦截所有方法调用,先统一处理rules里的浮点数(或者其他格式化逻辑),再把处理后的参数传给目标方法。不过这里有个关键细节要注意——避免递归调用__getattribute__,得用super()来获取原始方法。

具体实现示例

下面是一个完整的代码示例,展示如何在调用任何标题生成方法前,自动把rules里的浮点数四舍五入到一位小数:

class Titles:
    def __getattribute__(self, name):
        # 获取原始的属性/方法,避免递归触发__getattribute__
        original_attr = super().__getattribute__(name)
        
        # 只拦截我们定义的标题生成方法(这里用"generate_"前缀来识别)
        if callable(original_attr) and name.startswith("generate_"):
            # 包装原始方法,先处理rules再调用
            def wrapped_method(rules):
                # 执行统一格式化步骤
                processed_rules = self._format_rules(rules)
                # 调用原始方法,传入处理后的规则
                return original_attr(processed_rules)
            
            return wrapped_method
        
        # 非目标方法/属性直接返回原始值
        return original_attr
    
    def _format_rules(self, rules):
        """统一处理rules里的浮点数,保留一位小数"""
        processed = {}
        for key, value in rules.items():
            if isinstance(value, float):
                processed[key] = round(value, 1)
            else:
                processed[key] = value
        return processed
    
    # 示例标题生成方法
    def generate_sales_report_title(self, rules):
        return f"季度销售总结:营收{rules['revenue']}亿,利润率{rules['margin']}%"
    
    def generate_user_analysis_title(self, rules):
        return f"用户活跃度报告:日均活跃{rules['daily_active']}人,留存率{rules['retention']}"

怎么用?

调用任何标题方法时,直接传入原始rules就好,格式化逻辑会自动执行:

titles = Titles()
raw_rules = {"revenue": 2.345, "margin": 15.678}
print(titles.generate_sales_report_title(raw_rules))
# 输出:季度销售总结:营收2.3亿,利润率15.7%

关键注意事项

  • 精准拦截目标方法:我这里用generate_前缀来识别需要处理的方法,你也可以维护一个方法列表(比如TARGET_METHODS = {"generate_sales_title", "generate_user_title"}),判断name是否在列表里,避免误拦截内置方法或工具方法。
  • 避免递归陷阱:一定要用super().__getattribute__(name)获取原始方法,不要直接用self.name——后者会再次触发__getattribute__,导致无限递归。
  • 灵活调整格式化逻辑:如果你的rules不是字典,而是类实例或者其他结构,只需要修改_format_rules的逻辑即可,比如遍历对象属性、处理列表里的浮点数等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:02:28