Python高级系统知识之(一):python装饰器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/taczeng/article/details/89604042

背景:学习python的人肯定听过一个词,装饰器,那到底什么是装饰器,网络知识有很多介绍,这里,我基于自己的理解,进行一个系统总结,希望能让更多人加深理解

作用:概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能

实战:

应用场景:
1,引入日志
2,函数执行时间统计
3,执行函数前预备处理
4,执行函数后清理功能
5,权限校验等场景
6,缓存
7,事务处理

装饰器怎么用:

NO1.简单装饰器(不带参数):

背景:我们代码里面经常有各种函数,为了监控到哪个函数出了问题,可以不修改代码的情况下为他们加入日志监控(当然,这只是其中一种应用,具体懂了装饰器之后,会有更多牛叉的应用)


def debug(func):
    def error_check():
        print('{func} error'.format(func=func.__name__))
        return func()

    return error_check


@debug
def decorator_fun_a():
    print('do sth')
    pass


@debug
def decorator_fun_b():
    print('do sth')
    pass

NO2.带参数装饰器(简单参数):

def debug(func):
    def error_check(arg):
        print('{func} error'.format(func=func.__name__))
        return func(arg)
    return error_check


@debug
def decorator_fun_a(arg):
    print('do sth use {arg}'.format(arg=arg))
    pass


@debug
def decorator_fun_b(arg):
    print('do sth {arg}'.format(arg=arg))
    pass

NO3.多参数的装饰器(通用):


def debug(func):
    def error_check(*args, **kwargs):  # 能解析一切参数了
        print('{func} error'.format(func=func.__name__))
        return func(*args, **kwargs)

    return error_check


@debug
def decorator_fun_a(arg):
    print('do sth use {arg}'.format(arg=arg))
    pass


@debug
def decorator_fun_b(arg1, arg2):
    print('do sth {arg1},{arg2}'.format(arg1=arg1, arg2=arg2))
    pass

NO4.更高阶的装饰器:

背景:现在需要针对不同函数打印不同日志级别

def debug(level):
    def log_check(func):
        def log_check_inner(*args, **kwargs):  # 能解析一切参数了
            print('{level} in {func}'.format(level=level, func=func.__name__))
            return func(*args, **kwargs)
        return log_check_inner
    return log_check


@debug(level='DEBUG')
def decorator_fun_a(arg):
    print('do sth use {arg}'.format(arg=arg))
    pass


@debug(level='ERROR')
def decorator_fun_b(arg1, arg2):
    print('do sth {arg1},{arg2}'.format(arg1=arg1, arg2=arg2))
    pass

有点绕,但是也好理解,你可以把它们当成函数,一个个执行,先执行最里面的,再执行外面的,debug调试一下就能看出来

拓展学习:希望大家可以有空拓展学习下类装饰器,以及python自带的装饰器,这里就不写了

猜你喜欢

转载自blog.csdn.net/taczeng/article/details/89604042