python裝飾器應用場景
阿新 • • 發佈:2021-10-26
# -*- coding:utf-8 -*-
# 學習裝飾器的一些常用場景
from functools import wraps
def decorator_name(f):
@wraps(f)
def decorated(*arg, **kwargs):
if not can_run:
return('Function will not run')
return f(*arg, **kwargs)
return decorated
@decorator_name
def func():
return('Function is running')
#can_run = True
#print(func())
can_run = False
print(func())
# 小結:@wraps接受一個函式來進行裝飾,並加入了複製函式名稱、註釋文件、引數列表等功能。
# 這可以讓我們在裝飾器裡面訪問在裝飾之前的函式的屬性
"""
裝飾器使用場景-授權(Authorization)
"""
# 裝飾器能有助於檢查某個人是否被授權去使用一個web應用的端點(endpoint)。它們被大量使用於
# Flask和Django web框架中。這裡是一個例子來使用基於裝飾器的授權
from functools import wraps
def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
auth = requests.authorization
if not auth or not check_auth(auth.username, auth.password):
authenticate()
return f(*args, **kwargs)
return decorated
"""
裝飾器使用場景-日誌(Logging)
"""
# 日誌是裝飾器運用的另一個亮點,這是個例子
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)
print(result)
"""
帶引數的裝飾器-在函式中嵌入裝飾器
"""
from functools import wraps
def logit1(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
@logit1(logfile='fun2.log')
def myfun1():
pass
myfun1()
"""
裝飾器類
"""
from functools import wraps
class logit2(object):
def __init__(self, logfile='out.log'):
self.logfile = logfile
def __call__(self, func):
@wraps(func)
def wrapped_function(*args, **kwargs):
log_string = func.__name__ + " was called"
print(log_string)
# 開啟logfile,並寫入內容
with open(self.logfile, 'a') as opened_file:
# 現在將日誌列印到指定的logfile
opened_file.write(log_string + '\n')
# 現在,傳送一個通知
self.notify()
return func(*args, **kwargs)
return wrapped_function
def notify(self):
print('logit只打日誌,不做別的')
pass
@logit2()
def myfunc2():
print('呼叫通知')
print('------')
myfunc2()
# 現在,我們給logit建立子類,來新增email的功能
class email_logit(logit2):
"""
一個logit的實現版本,可以在函式呼叫時傳送email給管理員
"""
def __init__(self, email='[email protected]', *args, **kwargs):
self.email = email
super(email_logit, self).__init__(*args, **kwargs)
def notify(self):
# 傳送一封email到self.email
# 這裡就不做實現了
pass
本文來自部落格園,作者:ReluStarry,轉載請註明原文連結:https://www.cnblogs.com/relustarry/p/15466039.html