【ITニュース解説】How Decorator in Python Simplifies Code with Real Examples

2025年09月07日に「Medium」が公開したITニュース「How Decorator in Python Simplifies Code with Real Examples」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

Pythonのデコレータは、コードの重複を減らし、可読性を向上させる機能。関数に機能を追加したり、修正したりする際に便利。デコレータを使うことで、元の関数を変更せずに、前処理や後処理を簡単に追加できる。認証処理やログ出力など、様々な場面で役立ち、コードをよりシンプルに保つことが可能。

ITニュース解説

このニュース記事は、Pythonのデコレータという機能について解説している。デコレータは、関数やクラスの機能を変更したり、拡張したりするための便利なツールだ。初心者にとって少し難しい概念かもしれないが、デコレータを使うことでコードをより簡潔にし、再利用性を高めることができる。

まず、関数がPythonにおいて「第一級オブジェクト」であるという点を理解する必要がある。これは、関数を変数に代入したり、別の関数の引数として渡したり、関数の戻り値として返したりできる、ということを意味する。この性質がデコレータの基礎となる。

デコレータは、既存の関数を受け取り、その関数をラップして新しい関数として返す高階関数だ。ラップされた関数は、元の関数に加えて、デコレータ内で定義された追加の処理を実行する。

デコレータの基本的な構文は次のようになる。

1@decorator_function
2def my_function():
3  # 関数の処理
4  pass

この@decorator_functionという記法がデコレータの適用を表している。これは、my_function = decorator_function(my_function)と等価だ。つまり、my_functiondecorator_functionによってラップされた新しい関数に置き換えられる。

具体例を挙げて説明する。例えば、関数の実行時間を計測するデコレータを作成したいとしよう。

1import time
2
3def timer_decorator(func):
4  def wrapper(*args, **kwargs):
5    start_time = time.time()
6    result = func(*args, **kwargs)
7    end_time = time.time()
8    execution_time = end_time - start_time
9    print(f"{func.__name__} の実行時間: {execution_time:.4f}秒")
10    return result
11  return wrapper

このtimer_decoratorは、関数funcを受け取り、wrapper関数を定義して返す。wrapper関数は、funcの実行前後に時間を計測し、実行時間を表示する。そして、funcの結果を返す。*args**kwargsは、funcが任意の引数を受け取れるようにするためのテクニックだ。

このデコレータを関数に適用するには、@timer_decoratorのように関数定義の直前に記述する。

1@timer_decorator
2def my_function(n):
3  time.sleep(n)
4  return n * 2
5
6result = my_function(2)
7print(f"結果: {result}")

この例では、my_functionの実行時間が計測され、結果とともに出力される。

デコレータの利点は、コードの重複を減らし、関数の機能をモジュール化できることだ。例えば、複数の関数に対して同じようなログ出力処理を追加したい場合、デコレータを使えば、それぞれの関数に同じコードを記述する必要がなくなる。デコレータを一度定義すれば、それを必要な関数に適用するだけで済む。

また、デコレータは、関数に副作用を追加する場合にも役立つ。例えば、関数の結果をキャッシュするデコレータや、関数を実行する前に認証処理を行うデコレータなどが考えられる。

デコレータは、引数を取ることもできる。引数を取るデコレータは、デコレータ関数自体が別の関数を返す必要がある。

1def repeat_decorator(num_times):
2  def actual_decorator(func):
3    def wrapper(*args, **kwargs):
4      for _ in range(num_times):
5        result = func(*args, **kwargs)
6      return result
7    return wrapper
8  return actual_decorator
9
10@repeat_decorator(num_times=3)
11def say_hello(name):
12  print(f"Hello, {name}!")
13
14say_hello("Alice")

この例では、repeat_decoratornum_timesという引数を受け取り、actual_decorator関数を返す。actual_decoratorは、関数funcを受け取り、wrapper関数を返す。wrapper関数は、funcnum_times回実行する。

このように、デコレータは非常に柔軟な機能であり、さまざまな用途に活用できる。最初は少し難しく感じるかもしれないが、実際にコードを書いて試してみることで、その便利さを理解できるだろう。デコレータを使いこなせるようになると、より効率的で読みやすいPythonコードを書けるようになる。

関連コンテンツ

関連ITニュース