@2020.3.23 課後練習——裝飾器 一:編寫函數,(函數執行的時間用time.sleep(n)模擬) 二:編寫裝飾器,為函數加上統計時間的功能 三:編寫裝飾器,為函數加上認證的功能 四:編寫裝飾器,為多個函數加上認證的功能(用戶的賬號密碼來源於文件),要求登錄成功一次,後續的函數都無需再輸入用 ...
@2020.3.23
課後練習——裝飾器
一:編寫函數,(函數執行的時間用time.sleep(n)模擬)
import time def index(x,y): time.sleep(3) print('index %s %s' %(x,y)) index(111,222)
二:編寫裝飾器,為函數加上統計時間的功能
import time def index(x,y): start=time.time() time.sleep(3) print('index %s %s' %(x,y)) stop = time.time() print(stop - start) index(111,222)
三:編寫裝飾器,為函數加上認證的功能
def auth(func): def wrapper(*args, **kwargs): # 1、調用原函數 # 2、為其增加新功能 name = input('your name>>: ').strip() pwd = input('your password>>: ').strip() if name == 'egon' and pwd == '123': res = func(*args, **kwargs) return res else: print('賬號密碼錯誤') return wrapper @auth def index(): print('from index') index()
四:編寫裝飾器,為多個函數加上認證的功能(用戶的賬號密碼來源於文件),要求登錄成功一次,後續的函數都無需再輸入用戶名和密碼
註意:從文件中讀出字元串形式的字典,可以用eval('{"name":"egon","password":"123"}')轉成字典格式
db='db.txt' login_status={'user':None,'status':False} def auth(auth_type='file'): def auth2(func): def wrapper(*args,**kwargs): if login_status['user'] and login_status['status']: return func(*args,**kwargs) if auth_type == 'file': with open(db,encoding='utf-8') as f: dic=eval(f.read()) name=input('username: ').strip() password=input('password: ').strip() if name in dic and password == dic[name]: login_status['user']=name login_status['status']=True res=func(*args,**kwargs) return res else: print('username or password error') elif auth_type == 'sql': pass else: pass return wrapper return auth2 @auth() def index(): print('index') @auth(auth_type='file') def home(name): print('welcome %s to home' %name) index() home('mili')
五:編寫裝飾器,為多個函數加上認證功能,要求登錄成功一次,在超時時間內無需重覆登錄,超過了超時時間,則必須重新登錄
import time,random user={'user':None,'login_time':None,'timeout':0.000003,} def timmer(func): def wrapper(*args,**kwargs): s1=time.time() res=func(*args,**kwargs) s2=time.time() print('%s' %(s2-s1)) return res return wrapper def auth(func): def wrapper(*args,**kwargs): if user['user']: timeout=time.time()-user['login_time'] if timeout < user['timeout']: return func(*args,**kwargs) name=input('name>>: ').strip() password=input('password>>: ').strip() if name == 'egon' and password == '123': user['user']=name user['login_time']=time.time() res=func(*args,**kwargs) return res return wrapper @auth def index(): time.sleep(random.randrange(3)) print('welcome to index') @auth def home(name): time.sleep(random.randrange(3)) print('welcome %s to home ' %name) index() home('mili')
六:選做題
# 思考題(選做),疊加多個裝飾器,載入順序與運行順序,可以將上述實現的裝飾器疊加起來自己驗證一下
# @deco1 # index=deco1(deco2.wrapper的記憶體地址)
# @deco2 # deco2.wrapper的記憶體地址=deco2(deco3.wrapper的記憶體地址)
# @deco3 # deco3.wrapper的記憶體地址=deco3(index)
# def index():
# pass