python學習第十二天:閉包函數與裝飾器
阿新 • • 發佈:2018-06-11
源代碼 -s 為什麽 pre def func stop 修改 rom
閉包函數:
什麽是閉包函數:
閉指的是定義在一個函數內部
包指的是該函數包含對外部作用域(非全局作用域)名字的引用
def counter(): n=0 def incr(): nonlocal n x=n n+=1 return x return incr c=counter() print(c())
閉包的意義:返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層作用域,這使得,該函數無論在何處調用,優先使用自己外層包裹的作用域
裝飾器
1.什麽是裝飾器
就目前來看:裝飾器就是定義一個函數,只不過該函數的功能是用來為其它函數添加額外的功能的
其實:裝飾器本身其實可以是任意可調用的對象,
被裝飾的對象也可以是任意可調用的對象。
2.為什麽要用裝飾器
軟件維護應該遵循開發封閉原則:
開放封閉原則指的是:
①軟件一旦上線運行後對修改源代碼是封閉的
②對擴展功能是開放的
這就用到了裝飾器
裝飾器的實現必須遵守兩大原則:
①不可修改被裝飾對象的源代碼
②不可修改被裝飾對象的調用方式
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print(‘run time is %s‘ %(stop_time-start_time)) return res return wrapper @timmer def foo(): time.sleep(3) print(‘from foo‘) foo()
其實@代表語法糖
@timmer 表示foo = timmer(foo)
python學習第十二天:閉包函數與裝飾器