装饰器

一、什么是python装饰器
python装饰器(函数):装饰函数或者类,对函数或类进行功能的扩展
标记符号:@函数名称
python装饰器:函数装饰器和类装饰器
装饰器的使用场景:
鉴权
日志
pytest
unittest
二、装饰函数
#装饰器函数的应用场景
def runTime(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        #执行原来函数的功能
        try:
            func(*args,**kwargs)
            info="无异常"
        except Exception as error:
            errorinfo="有异常,异常信息"+str(error)
        #执行扩展功能
        time.sleep(1)
        end_time = time.time()
        const = end_time - start_time
        print(f"统计{func.__name__}函数运行耗时{const}秒")
    return wrapper

@runTime
def  welcome_titen():
    print("欢迎来到Titen的园子")
@runTime
def function1(a,b):
    sum=0
    sum=a+b
    print(f"执行函数1代码,a+b={sum}")

  

三、装饰类
class Demo:
    def __init__(self,func):
        self._func=func

    #实例() 自动化执行__call__方法
    def __call__(self, *args, **kwargs):
        print("执行__call__方法")
        # 执行被装饰的函数功能
        self._func()
        # 扩展功能
        print(f"执行{self._func.__name__}扩展功能")
@Demo
def test():
    print("执行test函数")
@Demo
def test2():
    print("执行test2函数")
四、装饰器执行顺序

注:当被装饰的函数存在多个装饰器执行规则:最先执行最里面的装饰函数,最后执行最外层的装饰器函数(就近原则)

def a(func):
    def wrapper():
        func()
        print('a')
    return wrapper

def b(func):
    def wrapper():
        func()
        print('b')
    return  wrapper


def c(func):
    def wrapper():
        func()
        print('c')
    return wrapper

@c
@b
@a
def test3():
    print("执行test3函数")


>>>a b c

 

本质:装饰函数的调用了装饰器内置函数,装饰类调用了类的__call__方法。

 

 

  每篇一句:

  你还记得小时候说过的话么?

 

上一篇:安卓BitmapFactory.decodeStream()返回null的问题解决方法


下一篇:Mysql对单表的操作