Pythonでデコレータの基本的な使い方と作成方法を理解する

この記事では、Pythonのデコレータの基本的な使い方と作成方法について詳しく解説します。具体的なコード例とその解説、さらには応用例まで、幅広くカバーしています。

目次

デコレータとは?

デコレータは、Pythonでよく使用される高度な概念の一つです。関数やメソッドを修飾(デコレート)するために使用され、コードの再利用性を高めたり、可読性を向上させる目的でよく使われます。

基本的な使い方

デコレータは`@`マークを使って、関数の定義の前に記述されます。以下は簡単な例です。


def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

このコードを実行すると、`say_hello`関数を呼び出す前後に追加の処理が行われます。

自作デコレータの作成方法

Pythonでは、独自のデコレータを作成することも可能です。基本的には高階関数(関数を引数として受け取り、関数を返す関数)を用います。

デコレータの基本形

以下はデコレータの基本形です。


def decorator(func):
    def wrapper(*args, **kwargs):
        # 前処理
        result = func(*args, **kwargs)
        # 後処理
        return result
    return wrapper

応用例

ログ出力

関数が呼び出された際にログを出力するデコレータの例です。


import datetime

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"{datetime.datetime.now()}: Called {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def my_function():
    print("Doing something...")

引数の型チェック

関数の引数の型をチェックするデコレータです。


def type_check_decorator(func):
    def wrapper(x):
        if not isinstance(x, int):
            raise TypeError("Argument must be an integer.")
        return func(x)
    return wrapper

@type_check_decorator
def square(x):
    return x * x

キャッシュ機能

繰り返し同じ引数で呼び出される関数の結果をキャッシュするデコレータです。


from functools import lru_cache
@lru_cache(maxsize=32)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

まとめ

デコレータはPythonの高度な機能の一つで、コードの再利用性や可読性を高めるのに有用です。基本的な使い方から自作デコレータの作成方法、さらには応用例まで解説しました。この知識を活かして、より効率的なコーディングを行いましょう。

コメント

コメントする

目次