python 的装饰器
定义一个函数对参数作处理
面向对象语言中的装饰器模式。增加一个修饰类包裹原来的类,在运行时进行装饰(extends 是编译时,具体 维基百科),包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。
这里,利用 python语言中函数作为返回值的特性,实现了包裹另一个函数(达到装饰的目的)。
# closure_demo.py def my_sum(*arg): return sum(arg) def my_average(*arg): return sum(arg)/len(arg) def my_decorate(func): def checkparams(*args): if len(args) == 0: return 0 for i in args: if not isinstance(i, int): print('error, type cannot be', type(i)) return 0 return func(*args) return checkparams f = my_decorate(my_sum) # 1 print(f(20, 14, 42)) # 2
输出
76
这里,顺便使用了闭包。1 是得到装饰函数(不是目的),2 是调用新的装饰函数(真正的目的)
为了直接使用 2,可以在需要装饰的函数上添加 python中定义的 @符号
def my_decorate(func): def checkparams(*args): if len(args) == 0: return 0 for i in args: if not isinstance(i, int): print('error, type cannot be', type(i)) return 0 return func(*args) return checkparams def my_sum(*arg): return sum(arg) @my_decorate def my_average(*arg): return sum(arg)/len(arg) print(my_average(20, 14, 35)) # my_decorate = my_decorate(my_sum) # The "@my_decorate" made actually # print(my_decorate(20, 14, 42))
输出
23.0