Python高级语法之装饰器

这篇博客探讨了Python中装饰器的使用,从基本的函数包装到使用*args和**kwargs处理不同数量的参数。通过多个示例,展示了如何在不修改原函数代码的情况下,添加打印横线的功能,实现函数执行前的提示。此外,还介绍了装饰器的语法糖,使得代码更加简洁易读。最后,优化后的程序展示了如何处理不同数量的位置和关键字参数,使装饰器更具通用性。
摘要由CSDN通过智能技术生成

装饰器

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lilinwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值