理解Python装饰器(Decorator)
想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。
闭包
在函数的内部定义一个函数,并且里面的这个函数用到了外面函数的变量,那么将里面的函数和所用到的变量称为闭包
注意点:
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
-
实例1
def outdoor(num1):
def indoor(num2):
print("在函数内部的数字是:",num2)
# 用到外部函数的num1
return num1+num2
return indoor
ret = outdoor(10)
print("闭包返回结果:",ret(20))
outdoor 函数 返回的结果indoor 携带ret 进去内部函数 最终返回闭包结果 num1+num2
-
实例2
def outdoor(a,b):
def indoor(x):
return a*x+b
return indoor
ret1 = outdoor(1,5)
ret2 = outdoor(2,5)
print(ret1(10)) # 15
print(ret2(10)) # 25
我们先将ret带入可以看到式子变成 x+5 和 2x+5
再讲x 带入就可以计算出结果 15 ,25
装饰器
装饰器是程序开发中经常会用到的一个功能,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象
def w1(func):
def inner():
print("hahaha")
func()
return inner
@w1
def f1():
print('f1')
python解释器会从上到下解释代码
- def w1(func): ==>将w1函数加载到内存
- @w1
@函数名 是python的一种语法糖。
@w1 此时等于 w1(f1)
先去执行装饰器里面的方法 然后再去执行f1函数
-
被装饰的不带参数
from time import ctime, sleep def timefun(func): def wrapped_func(): print("foo函数执行时间为%s"%ctime()) func() return wrapped_func @timefun def foo(): print("我现在被执行了") foo() sleep(2) foo() #foo函数执行时间为Mon May 18 11:35:12 2020 # 我现在被执行了 # foo函数执行时间为Mon May 18 11:35:14 2020 # 我现在被执行了
第一次foo() 是将函数本身当做参数去执行time(foo) 返回得到wrapped_func
-
被装饰的带参数
from time import ctime, sleep def timefun(func): def wrapped_func(a, b): print("foo函数执行时间为%s" % ctime()) print(a, b) func(a, b) return wrapped_func @timefun def foo(a, b): print(a+b) foo(3,5) sleep(2) foo(2,4)
-
被装饰的带不定参数
-
from time import ctime, sleep def timefun(func): def wrapped_func(*args, **kwargs): print("foo函数执行时间为%s" % ctime()) func(*args, **kwargs) return wrapped_func @timefun def foo(a, b, c): print(a+b+c) foo(1,5,7) sleep(2) foo(3,4,9)
以上就是装饰器的简单使用啦!