完美的装饰器和语法糖

一、wraps
一般的装饰器公式:只对原函数加功能,但名字等属性为函数warpper

无参装饰器:
def index(func):
    def warpper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return warpper
@index
def func(x):
    print(x)
print(func.__name__)
===》warpper

加上wraps全面包装成原函数属性:需要提取模块

from functools import wraps
def timmer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        return
    return wrapper
@timmer  # index= timmer(index)  # index=wrapper
def index():
    print('from index')
print(index.__name__)
===>index

wrapper装饰太麻烦了,而且平常没啥用就很少使用。

二、装饰器生成式

语法糖就是@ 放在被装饰的函数上@后加上装饰器的名字,自动完成包装
1、有参装饰器公式:

def outter(x):
    def index(func):
        def warpper(*args,**kwargs):
            print(x)
            res=func(*args,**kwargs)
            print(3)
            return res
        return warpper
    return index

@outter(1)
def f():
    print(2)
f()
====>
1
2
3

2、多个迭代器的叠加使用:


def outter1(func1):  # func1 = wrapper2的内存地址
    print('============>outter1')
    def wrapper1(*args,**kwargs):
        print('============>wrapper1')
        res1=func1(*args,**kwargs)
        return res1
    return wrapper1

def outter2(func2):  # func2 = wrapper3的内存地址
    print('============>outter2')
    def wrapper2(*args,**kwargs):
        print('============>wrapper2')
        res2=func2(*args,**kwargs)
        return res2
    return wrapper2


def outter3(func3):  # func3 = 被装饰函数也就是index的内存地址
    print('============>outter3')
    def wrapper3(*args,**kwargs):
        print('============>wrapper3')
        res3=func3(*args,**kwargs)
        return res3
    return wrapper3

          # index = wrapper1的内存地址
@outter1  # outter1(wrapper2的内存地址)->wrapper1的内存地址
@outter2  # outter2(wrapper3的内存地址)->wrapper2的内存地址
@outter3  # outter3(被装饰函数也就是index的内存地址)->wrapper3的内存地址
def index():
    print('from index')
===>>
============>outter3
============>outter2
============>outter1

原文地址:https://www.cnblogs.com/qiukangle/p/14098675.html