1. 程式人生 > >Python成長之路【第五篇】:Python基礎之裝飾器

Python成長之路【第五篇】:Python基礎之裝飾器

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基礎之裝飾器