Preloader Close

Python高级语法之装饰器

#定义四个函数,分别完成加减乘除 并且在计算加减乘除前,先输出一个分割线(===) #方案一:单独定义一个函数show,用于输出横线,每次调用运算函数前,先调用函数show def myAdd(a,b):     return a+b def mySubstract(a,b):     return a-b def myMultiply(a,b):     return a*b def myDivide(a,b):     return a/b def show(): 	print("======开始======")   #装饰 show() print(myAdd(3,4)) show() print(mySubstract(3,4)) show() print(myMultiply(3,4)) show() print(myDivide(3,4)) #结果 #======开始====== #7 #======开始====== #-1 #======开始====== #12 #======开始====== #0.75  #方案二:修改每一个函数,在每一个函数内,增加print语句完成 #定义四个函数,分别完成加减乘除 def myAdd(a,b):     print("======开始======")     return a+b def mySubstract(a,b):     print("======开始======")     return a-b def myMultiply(a,b):     print("======开始======")     return a*b def myDivide(a,b):     print("======开始======")     return a/b print(myAdd(3,4)) print(mySubstract(3,4)) print(myMultiply(3,4)) print(myDivide(3,4)) #结果 #======开始====== #7 #======开始====== #-1 #======开始====== #12 #======开始====== #0.75  #方案三:使用修饰器(假的)完成 def show(fun,a,b):     print("======开始======")     x = fun(a,b)     print(x) def myAdd(a,b):     return a+b def mySubstract(a,b):     return a-b def myMultiply(a,b):     return a*b def myDivide(a,b):     return a/b show(myAdd,3,4) show(mySubstract,3,4) show(myMultiply,3,4) show(myDivide,3,4) #结果 #======开始====== #7 #======开始====== #-1 #======开始====== #12 #======开始====== #0.75  #方案三:使用修饰器完成 def show(function):     def temp(x,y):         print("======开始======")         z = function(x,y)         return z     return temp def myAdd(a,b):     return a+b def mySubstract(a,b):     return a-b def myMultiply(a,b):     return a*b def myDivide(a,b):     return a/b myAdd = show(myAdd) print(myAdd(3,4)) mySubstract = show(mySubstract) print(mySubstract(3,4)) myMultiply = show(myMultiply) print(myMultiply(3,4)) myDivide = show(myDivide) print(myDivide(3,4)) #结果 #======开始====== #7 #======开始====== #-1 #======开始====== #12 #======开始====== #0.75  #方案四:使用修饰器语法糖:@修饰器 def show(function):     def temp(x,y):         print("======开始======")         z = function(x,y)         return z     return temp @show  #等价于myAdd = show(myAdd)  注意点:位置必须是实际函数前 def myAdd(a,b):     return a+b @show  #等价于myAdd = show(mySubstract) def mySubstract(a,b):     return a-b @show  #等价于myAdd = show(myMultiply) def myMultiply(a,b):     return a*b @show  #等价于myAdd = show(myDivide) def myDivide(a,b):     return a/b print(myAdd(3,4)) print(mySubstract(3,4)) print(myMultiply(3,4)) print(myDivide(3,4))  #上述过程中,参数的个数是固定的 #改进:能够使用不同的格式的参数 #args, arguments:收集所有位置参数 #kwargs, keyword args:关键字参数(字典等) def fun(*args,**kwargs):     print(args,kwargs) fun(1) fun(6,张三=18343336666) fun(6,7,8,李四=66) fun(王五=99,赵六=88) #结果 #(1,) {} #(6,) {'张三': 18343336666} #(6, 7, 8) {'李四': 66} #() {'王五': 99, '赵六': 88}  #优化后的程序1 def show(function):     def temp(*args,**kwargs):         print("======开始======")         z = function(*args,**kwargs)         return z     return temp @show  #等价于myAdd = show(myAdd)  注意点:位置必须是实际函数前 def myAdd(a,b):     return a+b @show def myAdd1(a,b,c):     return a+b+c @show  #等价于myAdd = show(mySubstract) def mySubstract(a,b):     return a-b @show  #等价于myAdd = show(myMultiply) def myMultiply(a,b):     return a*b @show  #等价于myAdd = show(myDivide) def myDivide(a,b):     return a/b print(myAdd(3,4)) print(myAdd1(3,4,5)) print(mySubstract(3,4)) print(myMultiply(3,4)) print(myDivide(3,4)) #结果 #======开始====== #7 #======开始====== #12 #======开始====== #-1 #======开始====== #12 #======开始====== #0.75   #优化后的程序2 def show(function):     def temp(*args,**kwargs):         print("======开始======")         z = function(*args,**kwargs)         print(z)         return z     return temp @show  #等价于myAdd = show(myAdd)  注意点:位置必须是实际函数前 def myAdd(a,b):     return a+b @show def myAdd1(a,b,c):     return a+b+c @show  #等价于myAdd = show(mySubstract) def mySubstract(a,b):     return a-b @show  #等价于myAdd = show(myMultiply) def myMultiply(a,b):     return a*b @show  #等价于myAdd = show(myDivide) def myDivide(a,b):     return a/b myAdd(3,4) myAdd1(3,4,5) mySubstract(3,4) myMultiply(3,4) myDivide(3,4) #结果 #======开始====== #7 #======开始====== #12 #======开始====== #-1 #======开始====== #12 #======开始====== #0.75