第四周 day4 python學習筆記
阿新 • • 發佈:2017-10-06
spa 頁面 logs 函數 home () class ack solid
關於裝飾器的更多信息可以參考http://egon09.blog.51cto.com/9161406/1836763
1.裝飾器Decorator
裝飾器:本質上是函數,(裝飾其他函數),就是為其他函數添加附加功能
原則:不能修改被裝飾函數的源代碼;不能修改被裝飾函數的調用方式
#實現裝飾器的知識儲備:
1.函數即變量
2.高階函數,有兩種方式:
(1)把一個函數名當做實參傳遞給另一個函數(在不修改被裝飾函數源代碼的情況下為其添加功能)
(2)返回值中包含函數名(不修改函數調用的方式)
3.嵌套函數
高階函數+嵌套函數==》裝飾器import time #計算一個函數的運行時間的裝飾器def timer(func): def wrapper(*kargs,**kwargs): start_time=time.time() func() end_time=time.time() print("the func runtime is %s"%(end_time-start_time)) return wrapper @timer def test1(): time.sleep(3) print("in the test1....") test1()#高階函數 def bar():print("in the bar...") def test(func): print(func)#打印出該函數變量的地址 func() test(bar)# 把一個函數名當做實參傳遞給另一個函數 import time def bar(): time.sleep(2) print("in the bar...") def test(func): start_time=time.time() func() #run bar() end_time=time.time() print(" the func runtime is %s"%(end_time-start_time)) test(bar)# 返回值中包含函數名 import time def bar(): time.sleep(2) print("in the bar...") def test2(func): print(func) return func bar2=test2(bar) bar2()#嵌套函數 #局部作用域和全局作用域的訪問順序 x=0 def grandpa(): x=1 print("grandpa:",x) def dad(): x=2 print("dad:",x) def son(): x=3 print("son:",x) son() dad() grandpa()#匿名函數:沒有定義函數名字的函數 calc=lambda x,y:x+y print(calc(13,15))import time def timer(func): def deco(*kargs,**kwargs): start_time=time.time() func(*kargs,**kwargs) end_time=time.time() print(" the func runtime is %s"%(end_time-start_time)) return deco @timer # test1=timer(test1) def test1(): time.sleep(2) print("in the test1.....") # test1=timer(test1) test1() @timer def test2(name,age): time.sleep(3) print("in the test2:",name,age) test2("Jean_V",20)#裝飾器進階版 #對各個頁面添加用戶認證 username,password="admin","123" def auth(auth_type): print("auth_type:",auth_type) def out_wrapper(func): def wrapper(*args,**kwargs): if auth_type=="local": uname=input("請輸入用戶名:").strip() passwd=input("請輸入密碼:").strip() if uname==username and passwd==password: print("\033[32;1m User has passed authentication\033[0m") res=func(*args,**kwargs) print("************after authentication") print(res) else: exit("\033[31;1m Invalid username or password\033[0m") elif auth_type=="LADP": print("我不會LADP認證,咋辦?。。。") return wrapper return out_wrapper def index(): print("index page......") @auth(auth_type="local")#home 頁采用本地驗證 def home(): print("home page.....") return "from home page....." @auth(auth_type="LADP")#bbs 頁采用LADP驗證 def bbs(): print("bbs page....") index() print(home()) home() bbs()
第四周 day4 python學習筆記