帶參數的裝飾器,裝飾器裝飾多個函數


帶參數的裝飾器

裝飾器其實就是一個閉包函數,就是兩層的函數,就應該具有函數傳參功能。

login_status = {
    'username': None,
    'status': False,
}

def auth(func):
    def inner(*args,**kwargs):
        if login_status['status']:
            ret = func()
            return ret
        username = input('請輸入用戶名:').strip()
        password = input('請輸入密碼:').strip()
        if username == '111' and password == '123':
            login_status['status'] = True
            ret = func()
            return ret
    return inner
def auth(x):
    def auth2(func):
        def inner(*args,**kwargs):
            if login_status['status']:
                ret = func()
                return ret
            username = input('請輸入用戶名:').strip()
            password = input('請輸入密碼:').strip()
            if username == '111' and password == '123':
                login_status['status'] = True
                ret = func()
                return ret
        return inner
    return auth

​ 舉例說明:抖音:綁定的是微信賬號密碼。 皮皮蝦:綁定的是qq的賬號密碼。 現在要完成的就是你的裝飾器要分情況去判斷賬號和密碼,不同的函數用的賬號和密碼來源不同。 但是之前寫的裝飾器只能接受一個參數就是函數名,所以寫一個可以接受參數的裝飾器。

def auth2(func):
    def inner(*args, **kwargs):
        if login_status['status']:
            ret = func()
            return ret
        if 微信:
            username = input('請輸入用戶名:').strip()
            password = input('請輸入密碼:').strip()
            if username == '111' and password == '123':
                login_status['status'] = True
                ret = func()
                return ret
        elif 'qq':
            username = input('請輸入用戶名:').strip()
            password = input('請輸入密碼:').strip()
            if username == '111' and password == '123':
                login_status['status'] = True
                ret = func()
                return ret
    return inner

@auth2
def jitter():
    print('記錄美好生活')


@auth2
def pipefish():
    print('期待你的內涵神評論')

解決方式:

def auth(x):
    def auth2(func):
        def inner(*args, **kwargs):
            if login_status['status']:
                ret = func()
                return ret

            if x == 'wechat':
                username = input('請輸入用戶名:').strip()
                password = input('請輸入密碼:').strip()
                if username == '111' and password == '123':
                    login_status['status'] = True
                    ret = func()
                    return ret
            elif x == 'qq':
                username = input('請輸入用戶名:').strip()
                password = input('請輸入密碼:').strip()
                if username == '111' and password == '123':
                    login_status['status'] = True
                    ret = func()
                    return ret
        return inner
    return auth2

@auth('wechat')  
def jitter():
    print('記錄美好生活')

@auth('qq')
def pipefish():
    print('期待你的內涵神評論')

@auth('wechat') :分兩步:

第一步先執行auth('wechat')函數,得到返回值auth2

第二步@與auth2結合,形成裝飾器@auth2 然后在依次執行。這樣就是帶參數的裝飾器,參數可以傳入多個。

裝飾器裝飾多個函數

多個裝飾器裝飾一個函數:

def wrapper1(func):
    def inner1(*args,**kwargs):
        print("這是裝飾器一開始")
        func(*args,**kwargs)
        print("這是裝飾器一結束")
    return inner1

def wrapper2(func):  
    def inner2(*args,**kwargs):
        print("這是裝飾器二開始")
        func(*args,**kwargs)
        print("這是裝飾器二結束")
    return inner2


@wrapper1  
@wrapper2  
def func():
    print("這是被裝飾的函數")

func()

打印結果:

這是裝飾器一開始
這是裝飾器二開始
這是被裝飾的函數
這是裝飾器二結束
這是裝飾器一結束

Python規定多個裝飾器裝飾一個函數的時候先執行離被裝飾的函數最近的裝飾器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM