1、裝飾器: 定義:本質是函數,用於裝飾其他函數:就是為其他函數添加附加功能。 原則:1.不能修改被裝飾的函數的源代碼 2.不能修改被裝飾的函數的調用方式 2、實現裝飾器知識儲備: 1). 函數即“變數” #大樓房間-門牌號 -->記憶體釋放機制 2). 高階函數 a: 把一個函數名當作實參傳給另一個 ...
1、裝飾器:
定義:本質是函數,用於裝飾其他函數:就是為其他函數添加附加功能。
原則:1.不能修改被裝飾的函數的源代碼
2.不能修改被裝飾的函數的調用方式
2、實現裝飾器知識儲備:
1). 函數即“變數” #大樓房間-門牌號 -->記憶體釋放機制
2). 高階函數
a: 把一個函數名當作實參傳給另一個函數(在不修改被裝飾函數源代碼的情況下為其添加功能)
b: 返回值中包含函數名(不修改函數的調用方式)
3). 嵌套函數
3、高階函數 + 嵌套函數 =》 裝飾器
示例一(初級):裝飾器作用,計算被裝飾函數的執行時間。
1 # -*- coding:utf-8 -*- 2 import time 3 4 def timer(func): 5 def deco(*args,**kwargs): 6 start_time = time.time() 7 func(*args,**kwargs) 8 stop_time = time.time() 9 print("the func run time is %s" %(stop_time-start_time)) 10 return deco 11 12 @timer 13 def test1(): 14 time.sleep(2) 15 print("in the test1") 16 17 @timer # @timer等價於:test2=timer(test2)=deco 18 def test2(name,age): 19 time.sleep(3) 20 print("info:%s,%s" %(name, age)) 21 22 test1() 23 test2("tj", 23) #等價於:deco("tj", 23) 24 25 >>> 26 in the test1 27 the func run time is 2.009901523590088 28 info:tj,23 29 the func run time is 3.009861946105957
示例二(進階)、裝飾器作用,進入頁面前進行用戶驗證,當進入home頁面時,使用驗證方法a,當進入bbs頁面時,使用驗證方式b,此示例中沒有b驗證方式,僅演示a驗證方式。
1 user="abc" 2 password="abc123" 3 4 def auto_outside(type): 5 def wrpper(func): 6 def deco(*args, **kwargs): 7 if type == "a": 8 username=input("Username:") 9 passwd=input("Password:") 10 if username==user and passwd==password: 11 print("登錄成功") 12 return func(*args, **kwargs) 13 else: 14 print("用戶名或密碼錯誤") 15 elif type == "b": 16 print("用什麼b") 17 return deco 18 return wrpper 19 20 def index(): 21 print("welcome to index pages") 22 23 @auto_outside(type="a") #type為驗證方式類型 24 def home(): 25 print("welcome to home pages") 26 return "from home" 27 28 @auto_outside(type="b") 29 def bbs(): 30 print("welcome to bbs pages") 31 32 index() 33 print(home()) 34 bbs() 35 36 >>> 37 welcome to index pages # index頁面不需要驗證 38 Username:abc 39 Password:abc123 40 登錄成功 41 welcome to home pages # home頁面使用a驗證方式,登錄成功後進入頁面 42 from home 43 用什麼b # 進入bbs頁面前提示沒有b驗證方式