Python之裝飾器---第十二天

1、裝飾器
(1)本質:裝飾器本質就是函數,爲其他函數添加附加功能
(2)原則:

  • 不修改被 修飾函數的源代碼
  • 不修改被修飾函數的調用方式

(3)裝飾器結構
裝飾器=高階函數+函數嵌套+閉包
(4)裝飾器舉例:

import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print("函數的運行時間是%s"%(stop_time-start_time))
        return res
    return wrapper

@timmer
def cal(l):
    res=0
    for i in l:
        time.sleep(0.1)
        res+=i
    return res

res=cal(range(20))
print(res)

#輸出結果:
函數的運行時間是2.046844005584717
190

*說明:@裝飾器名相當於給裝飾器賦值,裝飾器後面還可以加參數,裝飾的只是最外層函數
2、高階函數定義
函數的參數是一個函數名,函數的返回值是一個函數名,滿足以上其中一個就是高階函數。
3、使用裝飾器給函數加認證功能舉例

def auth_func(func):
    def wrapper(*args,**kwargs):
        username=input("用戶名:").strip()
        passwd=input("密碼:").strip()
        if username=="lalala" and passwd=="lalala":
            res=func(*args,**kwargs)
            return res
        else:
            print("賬號或密碼錯誤")
    return wrapper

@auth_func
def index():
    print("歡迎來到京東主頁")

@auth_func
def home(name):
    print("歡迎回家%s"%name)

@auth_func
def shopping(name):
    print("歡迎%s下次光臨"%name)

index()
home("Alex")
shopping("Alex")

說明: 但是以上有個缺點,就是每點擊一次界面,都需要輸入賬密,爲了解決這個問題,可以用session優化,即登錄一次驗證後無需再次登錄,代碼如下:

user_dic={"username":None,"login":False}

def auth_func(func):
    def wrapper(*args,**kwargs):
        if user_dic["username"] and user_dic["login"]:
            res=func(*args,**kwargs)
            return res
        username=input("用戶名:").strip()
        passwd=input("密碼:").strip()
        if username=="lalala" and passwd=="lalala":
            user_dic["username"]=username
            user_dic["login"]=True
            res=func(*args,**kwargs)
            return res
        else:
            print("賬號或密碼錯誤")
    return wrapper

@auth_func
def index():
    print("歡迎來到京東主頁")

@auth_func
def home(name):
    print("歡迎回家%s"%name)

@auth_func
def shopping(name):
    print("歡迎%s下次光臨"%name)

index()
home("Alex")
shopping("Alex")

#輸出結果:
用戶名:lalala
密碼:lalala
歡迎來到京東主頁
歡迎回家Alex
歡迎Alex下次光臨

再次優化,將賬號密碼放在一個列表裏,代碼如下:

user_list=[

    {"name":"123","passwd":"123"},
    {"name":"lalala","passwd":"lalala"},
    {"name":"666","passwd":"666"}

]

current_dic={"username":None,"login":False}

def auth_func(func):
    def wrapper(*args,**kwargs):
        if current_dic["username"] and current_dic["login"]:
            res=func(*args,**kwargs)
            return res
        username=input("用戶名:").strip()
        passwd=input("密碼:").strip()

        for user_dic in user_list:
            if username==user_dic["name"] and passwd==user_dic["passwd"]:
                current_dic["username"]=username
                current_dic["login"]=True
                res=func(*args,**kwargs)
                return res
        else:
            print("賬號或密碼錯誤")
    return wrapper

@auth_func
def index():
    print("歡迎來到京東主頁")

@auth_func
def home(name):
    print("歡迎回家%s"%name)

@auth_func
def shopping(name):
    print("歡迎%s下次光臨"%name)

index()
home("Alex")
shopping("Alex")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章