91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python裝飾器的寫法以及應用場景

發布時間:2020-08-05 17:15:07 來源:網絡 閱讀:418 作者:Python熱愛者 欄目:編程語言

應用場景:

1、授權(Authorization)

裝飾器能有助于檢查某個人是否被授權去使用一個web應用的端點(endpoint)。它們被大量使用于Flask和Django web框架中。這里是一個例子來使用基于裝飾器的授權:

from functools import wraps    # 最新版python引用是 import functools

def requires_auth(f):    #  f 就是我們需要裝飾的函數,一看就是不帶參數的裝飾器
    @wraps(f)     # 新版python寫法 @functools.wraps(f)
    def decorated(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password):
            authenticate()
        return f(*args, **kwargs)
    return decorated    # 該裝飾器需相關配置才能運行,這里是截取代碼展示應用

2.、日志(Logging)

日志是裝飾器運用的另一個亮點。這是個例子:

'''
遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
from functools import wraps

def logit(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging

@logit
def addition_func(x):
   """Do some math."""
   return x + x
result = addition_func(4)

我敢肯定你已經在思考裝飾器的一個其他聰明用法了。

3.、帶參數的裝飾器

帶參數的裝飾器是典型的閉包函數

4.、在函數中嵌入裝飾器

我們回到日志的例子,并創建一個包裹函數,能讓我們指定一個用于輸出的日志文件

'''
遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
from functools import wraps

def logit(logfile='out.log'):
    def logging_decorator(func):
        @wraps(func)
        def wrapped_function(*args, **kwargs):
            log_string = func.__name__ + " was called"
            print(log_string)
            # 打開logfile,并寫入內容
            with open(logfile, 'a') as opened_file:
                # 現在將日志打到指定的logfile
                opened_file.write(log_string + '\n')
            return func(*args, **kwargs)
        return wrapped_function
    return logging_decorator
@logit()
def myfunc1():
    pass

myfunc1()
# Output: myfunc1 was called
# 現在一個叫做 out.log 的文件出現了,里面的內容就是上面的字符串

@logit(logfile='func2.log')
def myfunc2():
    pass

myfunc2()
# Output: myfunc2 was called
# 現在一個叫做 func2.log 的文件出現了,里面的內容就是上面的字符串

5.、裝飾器類

現在我們有了能用于正式環境的logit裝飾器,但當我們的應用的某些部分還比較脆弱時,異常也許是需要更緊急關注的事情。比方說有時你只想打日志到一個文件。而有時你想把引起你注意的問題發送到一個email,同時也保留日志,留個記錄。這是一個使用繼承的場景,但目前為止我們只看到過用來構建裝飾器的函數。

幸運的是,類也可以用來構建裝飾器。那我們現在以一個類而不是一個函數的方式,來重新構建logit。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清远市| 林周县| 渝北区| 灵山县| 七台河市| 长武县| 登封市| 黔江区| 西青区| 宁阳县| 西吉县| 双城市| 资溪县| 舞钢市| 达孜县| 盐边县| 宜兰县| 营山县| 麻城市| 章丘市| 和龙市| 大名县| 台东县| 石渠县| 枣阳市| 大城县| 罗江县| 乡宁县| 黑水县| 房山区| 广丰县| 革吉县| 萝北县| 开阳县| 遵化市| 渝北区| 囊谦县| 陵川县| 大田县| 中牟县| 新邵县|