python學習5_裝飾器
阿新 • • 發佈:2018-07-25
else ces spa lda 功能 lease python學習 rom ==
裝飾器需要掌握以下知識點:
1.為被裝飾對象提供新功能的工具
2.裝飾器本身、被裝飾對象可以是任意可調用對象
3.軟件一旦上線後,應該對修改封閉,對擴展開放
4.原則:
- 不修改被裝飾對象的源代碼
- 不修改被裝飾對象的調用方式
#示例代碼1 import time # 裝飾器 def outter(func): def wrapper(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) end_time= time.time() print(‘run time is %s‘ % (end_time - start_time)) return res return wrapper # 被裝飾函數 @outter # inner = outter(inner) def inner(): print("This is inner.") time.sleep(3) @outter # home = outter(home) def home(name): print(‘welcome %s‘ %name) time.sleep(2) return 123 inner() print(‘-----‘) home(‘cooky‘)
6.示例代碼2:裝飾器模板
#示例代碼2 def outter(func): def inner(*args, **kwargs): res = func(*args, **kwargs) return res return inner
7.示例代碼3無參裝飾器:模擬實現用戶驗證
#示例代碼3 import time current_userinfo = {‘user‘:None} def outter(func):def wrapper(*args, **kwargs): if current_userinfo[‘user‘]: return func(*args, **kwargs) user = input(‘please input your username:‘).strip() pwd = input(‘please input your password:‘).strip() if (user == ‘cooky‘ and pwd == ‘123‘): print(‘login successfully‘) current_userinfo[‘user‘] = user res = func(*args, **kwargs) return res else: print(‘login failed‘) return wrapper @outter def inner(): print("This is inner.") time.sleep(3) @outter def home(name): print(‘welcome %s‘ %name) time.sleep(2) return inner() home(‘cooky‘)
8.示例代碼4:多個裝飾器的執行順序:語法自下而上解析,執行過程為從上到下。記住結論為自上而下執行代碼就可以了
@outter1 @outter2 def index(): print(‘this is index‘)#示例代碼4 def outter1(func): print(‘2.this is outter1‘) def wrapper1(*args, **kwargs): print(‘3.this is wrapper1‘) res = func(*args, **kwargs) return res return wrapper1 def outter2(func): print(‘1.this is outter2‘) def wrapper2(*args, **kwargs): print(‘4.this is wrapper2‘) res = func(*args, **kwargs) return res return wrapper2 @outter1 @outter2 def index(): print(‘5.this is index‘) index()
9.示例代碼5:有參裝飾器
#示例代碼5 import time current_userinfo={‘user‘:None} def auth(engine = ‘file‘): def outter(func): def wrapper2(*args, **kwargs): if engine == ‘file‘: if current_userinfo[‘user‘]: return func(*args, **kwargs) user = input(‘please input your username:‘).strip() pwd = input(‘please input your password:‘).strip() if (user == ‘cooky‘ and pwd == ‘123‘): print(‘login successfully‘) current_userinfo[‘user‘] = user res = func(*args, **kwargs) return res else: print(‘login failed‘) elif engine == ‘mysql‘: print(‘mysql認證機制‘) elif engine == ‘ldap‘: print(‘ldap的認證機制‘) else: print(‘不支持改engine‘) return wrapper2 return outter @auth(engine = ‘ldap‘) def index(): print(‘welcome to index page‘) time.sleep(3) index()
10.示例代碼6:wraps裝飾器實現原始函數的文檔和裝飾後函數的文檔一致
#示例代碼6 from functools import wraps def outter(func): @wraps(func) def wrapper(*args, **kwargs): res = func(*args, **kwargs) return res return wrapper @outter def inner(): """ this is inner‘s document :return: """ print(‘this is inner‘) print(help(inner)) print(inner.__name__)
python學習5_裝飾器