Python-装饰器

装饰器

在不改变原函数的情况下,为原来的函数加上一个验证:
def w1(func):
    def inner():
        print("-----inner-----")
        func()
    return inner

def f1():
    print("---f1---")

def f2():
    print("---f2---")

f1=w1(f1)
f1()

这里写图片描述

利用闭包的方式,将要调用的函数作为参数传进去

1.装饰器

def w1(func):
    def inner():
        print("-----inner-----")
        func()
    return inner
@w1
def f1():
    print("---f1---")

@w1
def f2():
    print("---f2---")

f1()
f2()

加上了@w1之后,相当于原来的f1=w1(f1)

#定义函数:完成包裹数据
def makeBold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped

#定义函数:完成包裹数据
def makeItalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped

@makeBold
def test1():
    return "hello world-1"

@makeItalic
def test2():
    return "hello world-2"

@makeBold
@makeItalic
def test3():
    return "hello world-3"

print(test1()))
print(test2()))
print(test3()))

运行结果:

<b>hello world-1</b>
<i>hello world-2</i>
<b><i>hello world-3</i></b>

2.装饰器执行时间

测试代码:

def w1(func):
    print("----w1----")
    def inner():
        print("-----inner-----")
        func()
    return inner
#只要Python解释器执行到这个代码,那么就会自动进行装饰,而不是等到调用的时候才装饰的
@w1
def f1():
    print("---f1---")

@w1
def f2():
    print("---f2---")
#在调用f1之前已经进行装饰了
f1()
f2()

这里写图片描述

3.装饰器对有参数的函数进行装饰

这里写图片描述

这里写图片描述

4.装饰器对不定长的参数的函数进行装饰

这里写图片描述
利用*args 和**kwargs

5. 有返回值的参数的函数装饰器

def w1(func):
    print("----w1----")
    def inner():
        print("-----inner-----")
        temp=func()
        return temp
    return inner
@w1
def f1():
    print("---f1---")
    return "shushu"

print(f1())

这里写图片描述

6.通用装饰器

def w1(func):
    def inner(*args,**kwargs):
        print("-----inner-----")
        temp=func(*args,**kwargs)
        return temp
    return inner

](![2017-08-14 11-46-56屏幕截图.png

7.装饰器带参数

这里写图片描述
可以根据装饰器的参数不同,后面执行不同的步骤

def y1(arg):
    def w1(func):
        def inner(*args,**kwargs):
            print("-----inner-----:%s"%arg)
            if(arg=="f1_test"):#针对参数不同,执行不同后续步骤
                print("----f1_test----")
                temp=func(*args,**kwargs)
            else:
                print("----other-----")
                temp=func(*args,**kwargs)
            return temp
        return inner
    return w1
#1.先执行y1("f1_test")函数,这个函数return的结果是w1这个函数的引用
#2.@w1
#3.使用@w1对f1进行装饰
@y1("f1_test")
def f1():
    print("---f1---")
f1()

@y1("f2_test")
def f2():
    print("---f2---")
f2()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值