理解python装饰器

def decorator(func):
    def wrapper(x):
        print("start")
        func(x)
        print("stop")
    return wrapper
@decorator
def hi(x):
    print(x)
hi(12345678)
#a=decorator(hi)
#hi=a
#hi(12345678)
 
使用装饰器的目的不再赘述。
装饰器的实现利用了python中闭包的特性,闭包基于python中一切皆对象的规则,如函数对象可以被当作返回值抛出,list、dict等结构可以存储对象或函数等。
外层函数的返回值为内层函数的引用,这样形式的嵌套函数被称为闭包,即例子中decorator函数。
装饰器即定义一个闭包,但是它接收的参数是一个函数(即需要被装饰的函数),这个传入的函数,最终流转进闭包中内层函数。由于闭包的特性,内层函数的引用最终被外层函数作为返回值抛出,接收并处理这个返回值即可。

装饰器的使用过程:
原有函数:
       函数执行:
              hi(12345678)
       执行结果: 1234578


装饰过程:
       使用装饰器:
              a=decorator(hi)
              hi=a
           可简化:
              hi=decorator(hi)
       函数执行:
              hi(12345678)
       执行结果:
              start
              12345678
              stop
可以看到在不改变原函数在上下文调用的情况下,在原函数基础上增加了功能
python中通过一个语法糖简化以上过程,即

@decorator
def hi(x):...
hi(12345678)

 
 

 

posted @ 2021-10-09 13:58  FengZhe  阅读(41)  评论(0编辑  收藏  举报