浅析python中装饰器原理

一、什么叫装饰器?

装饰器(decorator)的本质是一个函数,它接收一个函数作为参数,并返回一个被装饰过后的函数

二、装饰器的作用?

在不修改被修饰过函数的代码和和调用方式的情况下,给被装饰函数增加额外的功能

三、装饰器的应用场景?

插入日志、性能测试、事务处理、缓存、权限校验等场景

四、下面主要介绍函数装饰器

1.不带参数的装饰器
# 修饰函数不传参数
def log(fn):  # 装饰器‘log’本身就是函数,传入了一个函数‘fn’作为参数
    def ff():  # 修饰函数---起到修饰作用
        print('你好')
        fn()
    return ff  # 返回值为一个函数

@log
def f1():
    print('hello')
    
# 调用函数
f1() 

# 返回值
你好
hello

'''说明:
调用函数f1()时,先执行@log,最终会‘return’ff。
只需要看ff。ff做了个打印和调用函数fn(),调用函数fn()就等价于调用f1().
所以装饰器的本质就是把被修饰的函数‘f1’作为参数传入到修饰器'log'中,
然后在log下返回一个装饰函数‘ff’。然后在装饰函数'ff'中对被装饰函数‘f1’进行修饰和调用
'''

# 修饰函数传参数
def log(fn):  # 装饰器log
    def ff(*args, **kwargs):  # 修饰函数‘ff’传入了不定长参数
        print('开始打印日志了')
        result = fn(*args, **kwargs)  # 调用被装饰函数‘f2’,用变量‘result’接收
        print('打印日志了结束')
        return result  # 装饰函数ff返回值为被装饰函数‘f2’
    return ff


@log
def f2():
    print('日志')

# 调用函数‘f2’
f2()

# 返回值
开始打印日志了
日志
打印日志了结束


2.带参数的装饰器
def my_log(name):  # 参数‘name’
    def log(fn):
        def ff(*args, **kwargs):
            print(f'开始打印"{name}"日志了')
            result = fn(*args, **kwargs)
            print(f'打印"{name}"日志结束了')
            return result
        return ff
    return log  # 返回了一个装饰器


@my_log(name='错误')
def f3():
    print('日志')

# 调用函数
f3()

# 返回值
开始打印"错误"日志了
日志
打印"错误"日志结束了

'''
说明:带参数的装饰器和不带参数的装饰器差别不大,只是带参数的装饰器传入了参数,返回了一个装饰器
掌握了不带参数的装饰器,带参数的装饰器就是在不带参数的外面嵌套了一层函数,没有其他特殊的东西
'''

 

posted @ 2023-04-23 13:43  半步多爱你  阅读(181)  评论(0)    收藏  举报