Python成長之路【第五篇】:Python基礎之裝飾器
阿新 • • 發佈:2018-04-09
brush urn 新功能 clas 現在 hide rom 接收 調用
一、什麽是裝飾器
裝飾:裝飾既修飾,意指為其他函數添加新功能
器:器既函數
裝飾器定義:本質就是函數,功能是為其他函數添加新功能
二、裝飾器需要遵循的原則
1、不能修改裝飾器的源代碼(開放封閉原則)
2、為裝飾器函數添加新功能後,不能修改函數的調用方式
三、實現裝飾器的知識儲備
裝飾器 = 高階函數 + 函數嵌套 + 閉包
四、高階函數
高階函數的定義:
1、函數接收的參數是一個函數名
2、函數的返回值是一個函數名
3、滿足上述條件任意一個,都可以稱為之高階函數
1 def foo(): 2 print(‘我的函數名作為參數傳給高階函數‘) 3 def gao_jie1(func):高階函數示範4 print(‘我就是高階函數1,我接收的參數名是%s‘ %func) 5 func() 6 7 def gao_jie2(func): 8 print(‘我就是高階函數2,我的返回值是%s‘ %func) 9 return func 10 11 gao_jie1(foo) 12 gao_jie2(foo)
1 #高階函數應用1:把函數名當做參數傳給高階函數 2 import time 3 def foo(): 4 print(‘from the foo‘) 5 6 def timmer(func): 7把函數名當做參數傳給高階函數start_time=time.time() 8 func() 9 stop_time=time.time() 10 print(‘函數%s 運行時間是%s‘ %(func,stop_time-start_time)) 11 timmer(foo) 12 #總結:我們確實為函數foo增加了foo運行時間的功能,但是foo原來的執行方式是foo(),現在我們需要調用高階函數timmer(foo),改變了函數的調用方式
1 #高階函數應用2:把函數名當做參數傳給高階函數,高階函數直接返回函數名 2 import time函數返回值是函數名3 def foo(): 4 print(‘from the foo‘) 5 6 def timmer(func): 7 start_time=time.time() 8 return func 9 stop_time=time.time() 10 print(‘函數%s 運行時間是%s‘ %(func,stop_time-start_time)) 11 foo=timmer(foo) 12 foo() 13 #總結:我們確實沒有改變foo的調用方式,但是我們也沒有為foo增加任何新功能
高階函數總結:
1、函數接收的參數是一個函數名
作用:在不修改函數源代碼的前提下,為函數添加新功能
不足:會改變函數的調用方式
2、函數的返回值是一個函數名
作用:不修改函數的調用方式
不足:不能添加新功能
五、函數嵌套
def foo(name): print("from foo %s" %name) def ret(): print("from ret") def bar(): print("from bar") bar() ret() foo("Albert")
Python成長之路【第五篇】:Python基礎之裝飾器