装饰器原理
程序员文章站
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:
个人理解,有什么不对的还请指正,笔者一定虚心接受。
由于是对自己知识内容的整理归纳,所以可能不能面面俱到,很详细的那种,还请见谅。
上一篇: freemarker截取字符串subString()
下一篇: SIG_DFL和SIG_IGN