'@' 用作函數的修飾符,能夠在模塊或者類的定義層內對函數進行修飾,python
出如今函數定義的前一行,不容許和函數定義在同一行編程
一個修飾符就是一個函數,它將被修飾的函數做爲參數,並返回修飾後的同名函數或其餘可調用的東西?閉包
示例: 函數
def square_sum(fn): def square(*args): print "1---", args n = args[0] # return n*(n-1)*(2*n-1)/6 print "2==", n*(n-1)*(2*n-1)/6 print fn.__name__ fn(n*(n-1)*(2*n-1)/6) print "*"*15 return fn(n*(n-1)*(2*n-1)/6) return square @square_sum def sum_a(a): print "3=", a sum_a(10)
結果spa
1--- (10,) 2== 285 sum_a 3= 285 *************** 3= 285
能夠看出,他是先執行修飾器函數,而後有return fn的時候,修飾器下的函數纔是生效的,不然函數sum_a 是沒有結果的。code
裝飾器就是對一個函數進行包夾,先後增長代碼而獨立於函數代碼以外。其實也就是閉包。切片式編程的基礎。class