1. 程式人生 > 其它 >支撐千萬級併發的架構師如何一步步演進的?

支撐千萬級併發的架構師如何一步步演進的?

內容概要

  • 裝飾器的概念(重點)
  • 裝飾器簡易版本
  • 裝飾器進階版本
  • 裝飾器練習(認證功能)
  • 裝飾器固定模板
  • 裝飾器語法糖(簡化程式碼)
  • 有參裝飾器
  • 裝飾器練習題(三層裝飾器)

今日內容詳細

裝飾器的概念(重點)

"""
裝飾器並不是一個新的知識
	而是我們之前所學的 名稱空間 函式物件 閉包函式組合而來
"""
器:指的是工具
裝飾:給被裝飾物件新增額外的功能

裝飾器的原則
	開放封閉原則
    	開放:對擴充套件開放
        封閉:對修改封閉

裝飾器核心思想
	在不改變被"裝飾物件內部程式碼"和"原有呼叫方式"的基礎之上新增額外功能
    
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解釋