python装饰器实例

一 让被装饰函数即有返回值又能带任意个参数的装饰器

1.1 伪代码

def 装饰器函数(func):
    def 真正的被装饰函数(*args,**kwargs):
        前置代码
        ret = func(*args,**kwargs)
        后置代码
        return ret
    return 真正的被装饰函数

1.2 代码

def 装饰器函数(func):
    def 真正的被装饰函数(*args, **kwargs):
        print("前置代码")
        ret = func(*args, **kwargs)
        print(args)
        print(kwargs)
        print("被装饰函数的return是",ret)
        print("后置代码")
    return 真正的被装饰函数

@装饰器函数
def test(aa,bb,cc=33,dd=44):
    print("我是test函数")
    return aa + bb + cc + dd

if __name__ == "__main__":
    test(6,8,9,dd=100)

二 让装饰器中的变量能传递给被装饰函数

2.1 伪代码

def 装饰器函数(func):
    def 真正的被装饰函数(*args,**kwargs):
        前置代码
        x = 1  #要传给被装饰函数的变量
        ret = func(*args,a=x,**kwargs)
        后置代码
    return 真正的被装饰函数

@ 装饰器函数
def test(t1,t2,a):
    print(a) # 使用通过装饰器传来的变量

2.2 代码

def 装饰器函数(func):
    def 真正的被装饰函数(*args,**kwargs):
        print("前置代码")
        x = 1  #要传给被装饰函数的变量
        ret = func(*args, a=x, **kwargs)
        print("后置代码")
        return ret
    return 真正的被装饰函数

@ 装饰器函数
def test(t1,t2, a):
    print(a) # 使用通过装饰器传来的变量

test(1,2)

三 让装饰器能带参数- @ 装饰器函数(参数) 方法一 :三层装饰器

3.1 伪代码

3.2 代码

四 让装饰器能带参数- @ 装饰器函数(参数) 方法一 :使用两个装饰器

4.1 伪代码

def 装饰器函数1(接收由装饰器带来的参数1, 接收由装饰器带来的参数2): # 这两个形参接收装饰器传来的参数
    def wrapper1(func):
        return 装饰器函数2(func=func, 接收由装饰器带来的参数1=接收由装饰器带来的参数1, 接收由装饰器带来的参数2=接收由装饰器带来的参数2)
    return wrapper1

def 装饰器函数2(func,**kwargs):
    def 真正的被装饰函数(*args):
        前置代码
        ret = func(*args)
        print("由装饰器传入的参数是:",kwargs.get('接收由装饰器带来的参数1'))
        print("由装饰器传入的参数是:",kwargs.get('接收由装饰器带来的参数2'))
        后置代码
    return 真正的被装饰函数

@装饰器函数1("abc",666)  # 将"abc"和666分别作为两个参数传出来
def test(aa,bb,cc=33,dd=44):
    return aa + bb + cc + dd

4.2 代码

def 装饰器函数1(flag1,flag2): # flag1和flag2是接收装饰器传来的参数
    def wrapper1(func):
        return 装饰器函数2(func=func, flag1=flag1,flag2=flag2)
    return wrapper1

def 装饰器函数2(func,**kwargs):
    def 真正的被装饰函数(*args):
        print("前置代码")
        ret = func(*args)
        print("由装饰器传入的参数flag1是:",kwargs.get('flag1'))
        print("由装饰器传入的参数flag2是:",kwargs.get('flag2'))
        print("被装饰函数的return是",ret)
        print("后置代码")
    return 真正的被装饰函数

@装饰器函数1("abc",666)  # 将"abc"和666分别作为两个参数传给flag1和flag2
def test(aa,bb,cc=33,dd=44):
    print("我是test函数")
    print("test函数的aa=",aa)
    print("test函数的bb=",bb)
    print("test函数的cc=",cc)
    print("test函数的dd=",dd)
    return aa + bb + cc + dd

if __name__ == "__main__":
    test(6,8,9)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值