Python知识点-装饰器decorator

装饰器的作用就是在已经写好的函数上,不改动写好的函数的前提下,增加额外的功能

比如有100个不一样的函数,我想在这100个函数都额外增加一个相同的功能,利用装饰器可以减少重复代码

1.简单的装饰器

#普通装饰器不带参数
def outer(func):
    def inner(*args,**kwargs):
        print('装饰器内部函数开始')
        func(*args,**kwargs)
        print('装饰器内部函数结束')
    return inner
@outer
def foo(a,b):
    print('***********')
    print(a+b)
    print('***********')
foo(3,4)

#等同于下面这种写法:
def outer(func):
    def inner(*args,**kwargs):
        print('装饰器内部函数开始')
        func(*args,**kwargs)
        print('装饰器内部函数结束')
    return inner
def foo(a,b):
    print('***********')
    print(a+b)
    print('***********')

bar=outer(foo)
bar(3,4)

2.带参数的装饰器

#带参数的装饰器
def war(a='xiaoming'):
    def outer(func):
        def inner(*args,**kwargs):
            if a == 'xiaoming':
                print('传递的参数有效')
            else:
                print('传递的参数无效')

            print('装饰器内部函数开始')
            func(*args,**kwargs)
            print('装饰器内部函数结束')
        return inner
    return outer
@war('xiaoming')
def foo(a,b):
    print('***********')
    print(a+b)
    print('***********')

 foo(1,2)

#等同于下面的写法
def war(a='xiaoming'):
    def outer(func):
        def inner(*args,**kwargs):
            if a == 'xiaoming':
                print('传递的参数有效')
            else:
                print('传递的参数无效')

            print('装饰器内部函数开始')
            func(*args,**kwargs)
            print('装饰器内部函数结束')
        return inner
    return outer
def foo(a,b):
    print('***********')
    print(a+b)

ww=war('xiaoming')
bar=ww(foo)
bar(3,4)

3.多个装饰器

绑定多个装饰器

def outer1(func):
    print('这是装饰器11111 outer')
    def inner1(*args, **kwargs):
        print('这是装饰器11111 inner')
        func(*args, **kwargs)
        print('装饰器11111 inner 结束')
    return inner1

def outer2(func):
    print('这是装饰器22222 outer')
    def inner2(*args, **kwargs):
        print('这是装饰器22222 inner')
        func(*args, **kwargs)
        print('装饰器22222 inner 结束')
    return inner2

# @outer2
# @outer1
def foo():
    print('这是一个普通的foo函数')


# foo()

#执行顺序为先执行了outer1,foo这个函数被带到了outer1中替代func,执行了外层print,然后return inner1
#然后把inner1这个函数传到了outer2中,inner1代替了outer2中的func,这时执行了outer2的print,再接着返回了 inner2函数
#没有其他装饰器了,这是后就执行了inner2 函数,执行到inner2 的func()时,这时候func代表的事inner1这个函数,然后就跳到inner1去执行函数,直到结束返回inner2.
out1 = outer1(foo)
out2 = outer2(out1)
out2()

#执行结果:
'''
这是装饰器11111 outer
这是装饰器22222 outer
这是装饰器22222 inner
这是装饰器11111 inner
这是一个普通的foo函数
装饰器11111 inner 结束
装饰器22222 inner 结束
'''

 

posted @ 2018-12-18 10:33  gaoxing1  阅读(136)  评论(0编辑  收藏  举报