python语法之叠加装饰器、有参装饰器

时间:2019-11-13
本文章向大家介绍python语法之叠加装饰器、有参装饰器,主要包括python语法之叠加装饰器、有参装饰器使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、叠加装饰器

定义:在同一个被装饰对象,添加多个装饰器,并执行。


叠加装饰器的装饰顺序与执行顺序
装饰顺序:由下往上装饰。
执行顺序:由上往下执行。

注意:装饰器在调用被装饰对象时才会执行添加功能。

def wrapper1(func):
    def inner1(*args,**kwargs):
        print('1')
        res = func(*args,**kwargs)
        print('2')
        return res
    return inner1
def wrapper2(func):
    def inner2(*args,**kwargs):
        print('3')
        res = func(*args,**kwargs)
        print('4')
        return res
    return inner2
def wrapper3(func):
    def inner3(*args,**kwargs):
        print('5')
        res = func(*args,**kwargs)
        print('6')
        return res
    return inner3
@wrapper1  #inner1 = wrapper1(inner2)
@wrapper2   #inner2 = wrapper2(inner3)
@wrapper3    #inner3 = wrapper3(foo)
def foo():
    print('from foo')
foo()

二、有参装饰器

def wrapper(user):
    def outer(func):  #func = foo
        def inner(*args,**kwargs):
            if user == 'f':
                print('welcome haha')  #添加用户的功能
                res = func(*args,**kwargs)    #func() = foo()
                return res
            elif user == 'k':
                print('sorry neinei')   #添加用户的功能
                res = func(*args,**kwargs)       #func() = foo()
                return res
        return inner
    return outer
@wrapper("k")      #outer = wrapper(foo)
def foo():  #被装饰对象
    print('from foo')
foo()

三、wraps修复工具

#不导包的样子
# def wrapper(func):
#     def inner(*args,**kwargs):
#         '''
#         这是装饰器的注释
#         :param args:
#         :param kwargs:
#         :return:
#         '''
#         res = func(*args,**kwargs)
#         return res
#     return inner
# @wrapper
# def foo():
#     '''
#     这是被装饰对象的注释
#     :return:
#     '''
#     print('from foo')
# foo()
# print(foo)  #<function wrapper.<locals>.inner at 0x0000000009E352F0> 此时是装饰器的注释

#导包之后
from functools import wraps
def wrapper(func):
    @wraps(func)         #修改名称空间 foo--->func
    def inner(*args,**kwargs):
        '''
        这是装饰器的注释
        :param args:
        :param kwargs:
        :return:
        '''
        res = func(*args,**kwargs)
        return res
    return inner
@wrapper
def foo():
    '''
    这是被装饰对象的注释
    :return:
    '''
    print('from foo')
# foo()
print(foo.__doc__)

原文地址:https://www.cnblogs.com/Cheryl-D/p/11851689.html