シナリオ:
1、承認(認証)
デコレータは、人がエンドポイント(エンドポイント)のWebアプリケーションを使用することが許可されているかどうかのチェックをすることができます。彼らは広くフラスコと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.ログ(ログ)
もう一つのハイライトは、装飾用のログです。これは一例です:
'''
遇到问题没人解答?小编创建了一个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、クラスデコレータ
今、私たちは、正式な環境ロジットデコレータで使用することができていますが、アプリケーションの私達の部分のいくつかは、まだ比較的壊れやすいときに、より緊急の注意を必要とすることができる異常なもの。のは、時にはあなただけのログファイルに再生したいとしましょう。ログを保持したまま、時にはあなたがあなたの注意に問題を引き起こすことがしたいレコードを残し、電子メールを送信。これは、継承を使用したシーンで、これまでのところ、我々は唯一のデコレータを構築するために使用される機能を見てきました。
幸いなことに、このクラスはデコレータを構築するために使用することができます。私たちは、クラスの代わりに、関数は、ロジットを再構築するための方法になりました。