Python装饰器:简单来说,就是为一个函数增加新的功能。那出现Python装饰器的原因是什么呢?
举个例子:我们有一个加法函数Add_X_Y(x,y)
def Add_x_y(x,y): return x+y
然后,假如我们想为这个函数增加一条打印信息的语句,你会怎么做?
第一种方法:
def Add_x_y(x,y): print("This a func add x and y") return x+y那么你想一下,这是不是已经改变了函数 Add_X_Y(x,y)
第二种方法:就是利用装饰器了 (注:这里没有使用 语法糖 @ 因为我觉得,不使用@更直观)
def Wrapper_fuc(fuc): def Wrapper(): print("This a func add x and y")###增加的语句 sumxy=fuc return sumxy return Wrapper###解释一下,这两个return 的意思, ###第一个 return sumxy 是返回func的执行结果,在例子中就是Add_x_y(x,y) ###第二个 return Wrapper 是返回里面的函数Wrapper,因为你最终是要返回func的执行结果 ###而Wrapper 是调用了func,所以,你需要返回Wrapper才能返回func的执行结果def Add_x_y(x,y):return x+yNew_Add_x_y=Wrapper_fuc(Add_x_y(1,2))##新函数xy=New_Add_x_y()print("New_Add_x_y() x+y=",xy)print("Add_x_y() x+y=",Add_x_y(1,2))##旧函数
执行结果:
看,现在是不是在没有改变Add_X_Y(x,y)的情况下,产生了一个新的函数New_Add_x_y(),这就相当于为Add_X_Y(x,y)增加了新的功能了。
那么,我们为什么能够使用Python装饰器呢?原因有一下四点:
1)函数也是对象,函数也可以赋值给其他变量
def message(): print("hello,world") my_message=message my_message()2)函数可以嵌套,定义在另外一个函数内部
def Out_fuc(): print("out out ") def Inner_fuc(): print("inner inner") Inner_fuc() Out_fuc()3)函数可以作为参数返回
def fuc1(): def func2(): print("print func2") return func2 fuc3=fuc1() fuc3()4)函数可以作为参数传入
def fuc1(fuc3): fuc3() def func2(): print("print func2") fuc1(func2)