欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

装饰器原理

程序员文章站 2022-07-14 09:53:42
...

装饰器,可以说就是对闭包的一种应用。

1,功能需求

如果我们需要在执行某一函数之前需要执行另外一个操作,比如验证你是否有权限访问。
首先了解:

#### 第一波 ####
def foo():
    print('foo')

foo     #表示是函数
foo()   #表示执行foo函数

#### 第二波 ####
def foo():
    print('foo')

foo = lambda x: x + 1

foo()   # 执行下面的lambda表达式,而不再是原来的foo函数,因为foo这个名字被重新指向了另外一个匿名函数

一切皆引用,所有的函数名字都只是函数体在内存空间的一个引用。记住这个。

2,实现代码

假如我们现在有两个函数:

def fun():
    print("执行这条语句需要权限!")
def check():
    print("正在检查用户权限!")

可想而知,我们在进入fun函数执行语句之前肯定要先执行check函数来检查用户的权限。
像这样:

def fun():
    check()# 检查权限!
    print("执行这条语句需要权限!")

如果这是某一个完整的项目,而检查只是需要添加的功能,即不能在改动fun所在程序结构的的前提下执行check函数。这个时候,我们就需要用到装饰器

# 使用闭包
def wrap(fun):
    def check():
        print("正在检查用户权限!")
        fun()
    return check

具体代码实现:

@wrap
def fun():
    print("执行这条语句需要时间!")

3,代码原理

使用装饰器相当于执行了下面几项操作:

fun = wrap(fun) # wrap()的返回值check被fun引用,同时fun被check中引用。
fun() # 最终执行的是check,然后再check里面执行了原先fun放内容。

Inclusion:

个人理解,有什么不对的还请指正,笔者一定虚心接受。
由于是对自己知识内容的整理归纳,所以可能不能面面俱到,很详细的那种,还请见谅。

相关标签: Python 装饰器