重写__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
相关产品推荐
相关产品推荐

