裝飾器的寫法以及應用環境

一、受權(Authorization)python

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

 

複製代碼
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)

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

複製代碼
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.、帶參數的裝飾器

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

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

咱們回到日誌的例子,並建立一個包裹函數,能讓咱們指定一個用於輸出的日誌文件。框架

複製代碼
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,同時也保留日誌,留個記錄。這是一個使用繼承的場景,但目前爲止咱們只看到過用來構建裝飾器的函數。ui

幸運的是,類也能夠用來構建裝飾器。那咱們如今以一個類而不是一個函數的方式,來從新構建logitspa

相關文章
相關標籤/搜索