支撐千萬級併發的架構師如何一步步演進的?
阿新 • • 發佈:2021-11-11
內容概要
裝飾器的概念(重點)
裝飾器簡易版本
裝飾器進階版本
裝飾器練習(認證功能)
裝飾器固定模板
裝飾器語法糖(簡化程式碼)
有參裝飾器
裝飾器練習題(三層裝飾器)
今日內容詳細
裝飾器的概念(重點)
""" 裝飾器並不是一個新的知識 而是我們之前所學的 名稱空間 函式物件 閉包函式組合而來 """ 器:指的是工具 裝飾:給被裝飾物件新增額外的功能 裝飾器的原則 開放封閉原則 開放:對擴充套件開放 封閉:對修改封閉 裝飾器核心思想 在不改變被"裝飾物件內部程式碼"和"原有呼叫方式"的基礎之上新增額外功能 def index(): print('from index') index() # from index # 統計index函式的執行時間 import time # print(time.time()) # # 獲取的結果叫時間戳(執行程式碼的那一刻距離1970-1-1所經歷的秒數) # time.sleep(2) # 讓程式原地等待2秒 # print('睡飽了')
裝飾器簡易版本
# 給函式新增統計時間的功能 # def index(): # print('from index') # time.sleep(1) # # import time # def outer(func): # def get_time(): # start_time = time.time() # func() # end_time = time.time() # print('程式執行時間為:%s'%(end_time-start_time)) # return get_time # index = outer(index) # index() # 程式執行時間為:1.012636423110962
解決引數問題
# import time # def index(): # time.sleep(1) # print('開業了') # def login(name): # time.sleep(2) # print('%s正在發牌'%name) # def outer(func): # def get_time(*args,**kwargs): # start_time = time.time() # func(*args,**kwargs) # end_time = time.time() # print('程式執行時間為:%s'%(end_time-start_time)) # return get_time # index = outer(index) # index() # 程式執行時間為:1.0100035667419434 # login = outer(login) # login('tom') # 程式執行時間為:2.0142407417297363
解決返回值問題
# import time
# def index():
# time.sleep(1)
# print('開業了')
# return 'from index'
# def login(name):
# time.sleep(2)
# print('%s正在發牌'%name)
# return 'from login'
# def outer(func):
# def get_time(*args,**kwargs):
# start_time = time.time()
# res = func(*args,**kwargs)
# end_time = time.time()
# print('程式執行時間為:%s'%(end_time-start_time))
# return res
# return get_time
# index = outer(index)
# res = index() # 程式執行時間為:1.0100035667419434
# print(res) # from index
# login = outer(login)
# res = login('tom')
# print(res) # from login
認證裝飾器
# 普通版本
# import time
# def index():
# time.sleep(1)
# print('開局一把刀 裝備全靠爆')
# def home():
# time.sleep()
# print('往死裡學')
# # 獲取使用者輸入
# def login_auth(func):
# def auth(*args,**kwargs):
# username = input('username>>>:').strip()
# pwd = input('pwd>>>:').strip()
# if username == 'jason' and pwd == '123':
# print('使用者%s登入成功' % username)
# res = func()
# return res
# else:
# print('使用者名稱或密碼輸入錯誤')
# return auth
# index = login_auth(index)
# index()
# 進階版本
import time
def index():
time.sleep(1)
print('開局一把刀 裝備全靠爆')
def home():
time.sleep(1)
print('往死裡學')
# 定義一個使用者是否登入
is_login = {'is_login': False}
# 判斷使用者是否登入
def login_auth(func):
def auth(*args,**kwargs):
if is_login.get('is_login'):
res = func(*args, **kwargs)
return res
# 獲取使用者輸入
username = input('username>>>:').strip()
password = input('ppasswore>>>:').strip()
if username == 'jason' and password == '123':
res = func(*args,**kwargs)
is_login['is_login'] = True
return res
else:
print('使用者名稱或密碼輸入錯誤')
return auth
index = login_auth(index)
index()
home = login_auth(home)
home()
裝飾器固定模板
# def outer(func):
# def inner(*args,**kwargs):
# print('執行函式之前可以新增的額外功能')
# res = func(*args,**kwargs) # 執行被裝飾的函式
# print('執行函式之後可以新增的額外功能')
# return res
# return inner
裝飾器語法糖
def outer(func):
def inner(*args,**kwargs):
print('執行函式之前可以新增的額外功能')
res = func(*args,**kwargs)
print('執行函式之後可以新增的額外功能')
return res
return inner
@outer
def index():
print('from index')
@outer
def home():
print('from home')
index()
home()
"""
裝飾器語法糖書寫規範
語法糖必須緊貼在被裝飾物件的上方
裝飾器語法糖內部原理
會自動將下面緊貼的被裝飾物件名字當做引數傳給裝飾器函式呼叫
"""
雙層語法糖
# import time
# def get_time(func):
# def inner(*args,**kwargs):
# start_time = time.time()
# res = func()
# end_time = time.time()
# print('程式執行時間為:%s'%(end_time-start_time))
# return res
# return inner
# def login_auth(func):
# def auth(*args,**kwargs):
# username = input('username>>>:').strip()
# password = input('password>>>:').strip()
# if username == 'jason' and password == '123':
# res = func(*args, **kwargs)
# return res
# print('使用者名稱或密碼輸入錯誤')
# return auth
#
# @login_auth
# @get_time
# def index():
# time.sleep(1)
# print('開局一把刀 裝備全靠爆')
# index()
# @login_auth
# @get_time
# def home():
# time.sleep(1)
# print('往死裡學')
# home()
裝飾器修復技術
from functools import wraps
def outer(func):
@wraps(func)
def inner(*args,**kwargs):
print('執行函式之前可以新增的額外功能')
res = func(*args,**kwargs)
return res
return inner
@outer
def index():
print('from index')
print(index)
help(index)
#
def home():
"""這是一個home函式"""
print('from index')
print(home) # 列印函式home的記憶體地址
help(home) # 列印函式home解釋
help(len) # 列印函式len解釋