Python高级语法之装饰器

2023年7月30日12:07:40

装饰器

#定义四个函数,分别完成加减乘除 并且在计算加减乘除前,先输出一个分割线(===)
#方案一:单独定义一个函数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

  • 作者:lilinwang
  • 原文链接:https://blog.csdn.net/lilinwang/article/details/127417341
    更新时间:2023年7月30日12:07:40 ,共 3422 字。