0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

デコレーターについての備忘録

Posted at

デコレーターとは

デコレーターは、関数を修飾する関数です。これにより、関数を書き換えることなく、その関数に処理を追加したり、変更したりすることができます。

デコレーターを使わない例

まず、デコレーターを使わない例を見てみましょう。

def add(a, b):
    print(a + b)

print('Start!!')
add(1, 2)
print('Finish!!')

print('Start!!')
add(3, 4)
print('Finish!!')

このコードでは、add関数を呼び出す前後に同じメッセージを表示しています。

デコレーターの使用例

次に、デコレーターを使って上記の処理を簡略化する例を見てみましょう。

# デコレーター関数を定義
def my_decorator(func):
    def wrapper(a, b):
        print('Start!!')
        func(a, b)
        print('Finish!!')
    return wrapper

# 通常の関数
def add(a, b):
    print(a + b)

# デコレーターを手動で適用
add_result = my_decorator(add)
print(add_result)  # <function my_decorator.<locals>.wrapper at 0x...>

# デコレーターが追加された関数を実行
add_result(1, 2)
add_result(3, 4)

デコレーターの簡略化

デコレーターを関数の上に直接書くこともできます。これにより、デコレーターの適用が簡単になります。

# デコレーター関数を定義
def my_decorator(func):
    def wrapper(a, b):
        print('Start!!')
        func(a, b)
        print('Finish!!')
    return wrapper

# デコレーターを使用して関数を修飾
@my_decorator
def add(a, b):
    print(a + b)

# 修飾された関数を実行
add(1, 2)
add(3, 4)

汎用性の高いデコレーター

引数が固定されていると汎用性が低くなるため、可変長引数(*args)と可変長キーワード引数(**kwargs)を使って、どんな関数にも使えるようにします。

# 汎用性の高いデコレーター関数を定義
def my_decorator(func):
    def wrapper(*args, **kwargs):
        print('Start!!')
        func(*args, **kwargs)
        print('Finish!!')
    return wrapper

# デコレーターを使用して関数を修飾
@my_decorator
def add1(a, b):
    print(a + b)

@my_decorator
def add2(c, d, e):
    print(c + d + e)

# 修飾された関数を実行
add1(1, 2)
add2(3, 4, 5)

まとめ

デコレーターを使うことで、関数の前後に共通の処理を追加することが簡単にできます。これにより、コードの再利用性が高まり、可読性も向上します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?