在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**2
print(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