【python 基础篇 十二】python的函数-------函数装饰器

目录

装饰器

  1. 作用

    在函数名以及函数体不改变的前提下,给一个函数附加一些额外代码

  2. 案例

    • 发说说,发图片
  3. 注意事项

    • “开放封闭”原则 :已经写好的代码,尽可能不要修改,如果想要新增功能,在原先代码基础上,单独进行扩展。
    • 装饰器的执行时间,是立即执行
  4. 进阶

    • 装饰器叠加----从上到下装饰,从上到下装饰
    • 对有参函数进行装饰----无论什么场景,保证函数调用参数个数一致,为了通用,可以使用不定长参数,集合 拆包操作进行处理。
    • 对有返回值的函数进行装饰------无论什么场景,保证函数返回值一致
    • 带有参数的装饰器
#案例一  根据判断发说说还是图片
#定义功能函数
def fss():
    #print("登录验证。。。。")
    checkLogin()
    print("发说说")
def ftP():
    #print("登录验证。。。。")
    checkLogin()
    print("发图片")
def checkLogin():
    print("登录验证。。。。")
    
#业务逻辑代码
btnIndex = 2
if btnIndex == 1:
    #print("登录验证。。。。")
    fss()
else:
    #print("登录验证。。。。")
    ftP()
#发说说,发图片,必须有一个前提,是在用户登录之后,
#登录验证操作

#1.直接在业务逻辑代码里面去修改,添加一个验证操作
#   因为业务逻辑代码非常多,所有就造就了,每一份逻辑代码,在调用具体的功能函数之前,都需要去做有一个登录验证,这样就造成了代码冗余度比较大,代码的复用性比较差,代码的维护性比较差

#2. 直接在功能函数里面去修改,方便代码的重复使用

#改版2 使用装饰器
def checkLogin(func):
    def inner():
    	print("登录验证。。。。")
    	func()
    return inner
#定义功能函数
@checkLogin#fss =  checkLogin(fss)
def fss():
    print("发说说")
@checkLogin
def ftP():
    print("发图片")

#业务逻辑代码
btnIndex = 2
if btnIndex == 1:
    fss()
else:
    ftP()
#输出 登录验证。。。。 发图片
#进阶 装饰器叠加  从上到下装饰,从上到下装饰
def zhuangshiqi_line(func):
    def inner():
    	print("---------")
    	func()
    return inner
def zhuangshiqi_star(func):
    def inner():
    	print("*"*10)
    	func()
    return inner
#定义功能函数
@zhuangshiqi_line #print_content = zhuangshiqi_line(print_content)
def print_content():
    print("大家开心")
print_content()#输出 ---------  大家开心
#切换不同的装饰器 可以产生不同的效果
@zhuangshiqi_star
def print_content():
    print("大家开心")
print_content()#输出 **********  大家开心
#装饰器的叠加
@zhuangshiqi_line
@zhuangshiqi_star
def print_content():
    print("大家开心")
print_content()#输出 --------- **********  大家开心
#装饰器的执行逻辑  
def zhuangshiqi_star(func):
    def inner():
    	print("*"*10)
    	func()
    return inner
#定义功能函数
def print_content():
    print("大家开心")
print_content()#输出 ---------  大家开心
#@zhuangshiqi_line 等价于 print_content = zhuangshiqi_line(print_content)
#此时return inner 
#就是把print_content函数体里面改造成  
#print("*"*10)
#func() 等价于 print("大家开心")
#此时执行print_content函数 本质是执行 inner函数
#对有参函数进行装饰 用不定长的参数
def zsq(func):
    def inner(*args,**kwargs):
        print("****")
        #拆包
        res =  func(*args,**kwargs)#func是代表pnum的 pnum此时有返回值,直接接收就可以
        return res
     return inner
@zsq
def pnum(num,num2,num2):
    print(num,num2,num2)
    return num+num2+num2
pnum(221,345,num3=666)#输出 **** 1232
pnum(999)#输出 **** None
#对有返回值的函数进行装饰
def zsq(func):
    def inner(*args,**kwargs):
        print("****")
        #拆包
        func(*args,**kwargs)
     return inner
@zsq
def pnum(num):
    print(num)    
pnum(221,345,num3=666)#输出 **** 221 345 666
pnum(999)#输出 **** 999
#带有参数的装饰器
#getzsq的作用就是接收参数 ,并把参数传递给 inner
def getzsq(char):
    def zsq(func):
        def inner():
            print(char * 10)
            func()
        return inner
    return zsq
@getzsq("s")
def d1():
    print(666)#输出 ssssssssss 666
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Unknown To Known

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

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

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

打赏作者

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

抵扣说明:

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

余额充值