重温python 装饰器 每次都有新发现~~~
最近重温了Python装饰器,看了看网上的详解觉得还是有些绕...
先来一个通用装饰器:
def set_func(func):def call_func(*args, **kwargs):
return func(*args, **kwargs)
return call_func
再来个栗子:
from time import ctime, sleep
def timefun(func):
def wrapped_func():
print("%s called at %s" % (func.__name__, ctime()))
func()
return wrapped_func
@timefun
def foo():
print("I am foo")
foo()
sleep(2)
foo()
# foo called at Sun Jul 8 20:04:59 2018
# I am foo
# foo called at Sun Jul 8 20:05:01 2018
# I am foo
# foo = timefun(foo)
# foo先作为参数赋值给func后,foo接收指向timefun返回的wrapped_func
# foo()
# 调用foo(),即等价调用wrapped_func()
# 内部函数wrapped_func被引用,所以外部函数的func变量(*变量)并没有释放
# func里保存的是原foo函数对象
简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
如果看了这句简言之还是不明白装饰器啥意思...
那我再来一句更简言之:装饰器就是一个很朴素的偷梁换柱!!!! 经过装饰,被装饰的函数和装饰器内闭包的函数掉了个!!!
所以再次调用 "原函数" 就是 "被装饰" 的原函数.....
这个图比较好的诠释了 偷梁换柱...