パラメータ付きPythonデコレータ
8766 ワード
前の記事でPython decorator series , 我々はデコレータ、どのように動作し、簡単な機能ベースのデコレータとクラスベースのデコレータを実装するために学習している.この記事ではパラメータをサポートするデコレータを作成することを学びます.
パラメータをとるデコレータ ラッパー関数は
だから今では引数を持つデコレータを実装するには、クラスベースのアプローチを好む.それは非常に直感的であり、追加の内部機能と追加のboilerplateコードを修正する必要はありませんdocs.
これまでの例では、基本的なデコレータの実装を例に挙げました.次の記事では、様々な種類のデコレータのレシピを実装します.今後の記事をお楽しみください.ニュースレターを購読し、私の将来の記事を得るために私と接続します.
パラメータによる関数ベースのデコレータ
from functools import wraps
def hello_decorator(num):
"""Simple decorator function that supports parameters"""
def inner_func(func):
@wraps(func)
def wrapper(*args, **kwargs):
"""Simple decorator wrapper function"""
result = func(*args, **kwargs)
result = result + num
return result
return wrapper
return inner_func
@hello_decorator(100)
def add(a, b):
"""Simple function that returns sum of two numbers"""
return a + b
@hello_decorator(200)
def multiply(a, b):
"""Simple function that returns multiplication of two numbers"""
return a * b
if __name__ == '__main__':
output1 = add(2, 2)
print('Result:: ', output1)
print("=" * 25)
output2 = multiply(4, 2)
print('Result:: ', output2)
このように、構造は以前の例とは少し異なります.@hello_decorator(100)
- これは、我々が我々の装飾家に引数を渡すことができる方法ですhello_decorator
関数は内部関数を返す.inner_func
関数は引数として修飾され、ラッパー関数を返します.add
関数と引数に基づいて出力を操作するresult = result + num
を返します.パラメータを持つクラスベースのデコレータ
from functools import wraps
class HelloDecorator:
"""Simple class decorator"""
def __init__(self, num):
self.num = num
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
"""Simple class call method"""
result = func(*args, **kwargs)
result = result + self.num
return result
return wrapper
@HelloDecorator(100)
def add(a, b):
"""Simple function that returns sum of two numbers"""
return a + b
@HelloDecorator(200)
def multiply(a, b):
"""Simple function that returns multiplication of two numbers"""
return a * b
if __name__ == '__main__':
output1 = add(2, 2)
print('Result:: ', output1)
output2 = multiply(4, 2)
print('Result:: ', output2)
このクラスベースのパラメータを持つデコレータは、単純な関数ベースのデコレータと非常によく似ています.このメソッドで最高のものは、私たちは余分なboilerplateコードをdoc文字列を修正する必要はありません.だから今では引数を持つデコレータを実装するには、クラスベースのアプローチを好む.それは非常に直感的であり、追加の内部機能と追加のboilerplateコードを修正する必要はありませんdocs.
これまでの例では、基本的なデコレータの実装を例に挙げました.次の記事では、様々な種類のデコレータのレシピを実装します.今後の記事をお楽しみください.ニュースレターを購読し、私の将来の記事を得るために私と接続します.
Reference
この問題について(パラメータ付きPythonデコレータ), 我々は、より多くの情報をここで見つけました https://dev.to/kcdchennai/python-decorators-with-parameters-3kiiテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol