Python如何将带指定装饰器的函数存入类实例的self.funcs列表
实现方案
首先修正原代码的小笔误:原__init__中定义的属性名是self.func,但后续打印调用的是cal.funcs,需要先统一属性名。
完整实现代码如下:
class Calculator: def __init__(self): # 统一属性名为funcs self.funcs = [] # 定义装饰器方法 def collect_func(self, func): # 将被装饰的函数加入收集列表 self.funcs.append(func) # 直接返回原函数,不改变函数原有功能 return func cal = Calculator() # 使用实例的collect_func作为装饰器 @cal.collect_func def add_function(no1,no2): return no1+no2 # 可新增多个被装饰的函数测试 @cal.collect_func def multiply_function(no1,no2): return no1 * no2 print([i.__name__ for i in cal.funcs]) # 输出结果:['add_function', 'multiply_function']
逻辑说明
- 把装饰器定义为
Calculator类的实例方法,装饰器被调用时可以直接访问当前实例的self.funcs属性,耦合度更低 - 如果不需要修改原函数的执行逻辑,装饰器直接返回原函数即可,不需要额外嵌套包装层;如果需要给函数加前置/后置执行逻辑,再补充包装层即可
- 也可以用独立函数实现装饰器,直接引用已实例化的
cal对象,适合不需要复用装饰器的场景:
# 独立装饰器实现方式 def collect_calc_func(func): cal.funcs.append(func) return func @collect_calc_func def subtract_function(no1, no2): return no1 - no2
内容的提问来源于stack exchange,提问作者Fishball Nooodles
相关产品推荐
相关产品推荐

