在python中,@符号常被称作语法糖(装饰器),在某函数定义时,用以包装该函数,以达到截取,控制该函数的目的。
def d(f): print(‘d...‘) k=f #此处保留了传进来的原函数 f def f(x): return k(x)*2 return f #此处不能写成f(x),f是函数句柄,如果带(),则调用,这里只返回句柄。 @d def e(x): return x**2print(e(3))
比如上面代码,@d,就等价于e=d(e),d(e)的返回值为f,f在d中是一个函数句柄,e也是一个函数句柄,返回值是正确的,但经过语法糖后,此时的e不再是原来的e,而是d返回的f,再调用e(x),其实是调用f(x),也就是d(f)(x),通过k=f,将传进来的原函数保存至k中,以备后用。所以该装饰器的作用就是将原函数的返回值扩大2倍。
d... 18
打印值如上,证明确实将原函数返回值扩大了2倍。
语法糖也可以带参数,如下代码:
def a(x,y): def b(f): k=f def f(z): return x*y*k(z) return f return b @a(2,3) def e(x): return x**2 print(e(5))
同样的,@a(2,3)等价于e=a(2,3)(e),说明a(x,y)应该返回一个函数句柄,并且该函数句柄需要将e函数句柄作为参数传入,而这个函数句柄就是代码中的b,也就是说真正的装饰器是b,然后在b中,通过k=f,将传入的原函数句柄保存起来,当调用被包装后的e时,实际是调用了f,而f返回x*y*k(z),即将原函数返回值扩大x*y倍后,再返回。
150
原文地址:https://www.cnblogs.com/johnyang/p/12173751.html
时间: 2024-11-05 16:00:39