Movatterモバイル変換


[0]ホーム

URL:


40代文系エンジニアの思うこと

トップ>Python>Pythonのデコレーターを完全解説!基礎から応用まで学べる実践ガイド

Pythonのデコレーターを完全解説!基礎から応用まで学べる実践ガイド

この記事をはてなブックマークに追加

この記事は広告を含みます。

Pythonのデコレーター完全解説!初心者から上級者まで使える実践テクニック

Pythonの「デコレーター」という機能を知っていますか?デコレーターは、関数やクラスの動作を簡単に拡張できる強力な仕組みです。

この記事では、デコレーターの基本から応用までを徹底解説します。。


デコレーターとは?

デコレーターとは、関数の前後に処理を追加するための仕組み です。Pythonでは、関数を引数として受け取り、新しい関数を返す「高階関数」を利用してデコレーターを実装します。。

例えば、ログを記録する処理を関数の前後に追加したい場合、デコレーターを使うとスマートに実装できます。


デコレーターの基本構文

Pythonでデコレーターを作る基本構文を見てみましょう。

defmy_decorator(func):defwrapper():print("前処理: 関数を実行する前に動作")        func()print("後処理: 関数を実行した後に動作")return wrapper@my_decorator# デコレーターを適用defmy_function():print("メインの関数が実行されました")my_function()

実行結果

前処理: 関数を実行する前に動作メインの関数が実行されました後処理: 関数を実行した後に動作

このように、@デコレーター名 を関数の前に記述することで、デコレーターを適用できます。

デコレーターの実用例

1. 関数の実行時間を測定するデコレーター

import timedeftimer(func):defwrapper(*args, **kwargs):        start_time = time.time()        result = func(*args, **kwargs)        end_time = time.time()print(f"関数 {func.__name__} の実行時間: {end_time - start_time:.5f} 秒")return resultreturn wrapper@timerdefslow_function():    time.sleep(2)print("処理が完了しました")slow_function()

このデコレーターを使えば、関数の実行時間を簡単に測定できます。

2. ログを記録するデコレーター

deflog_function(func):defwrapper(*args, **kwargs):print(f"関数 {func.__name__} が呼び出されました")        result = func(*args, **kwargs)print(f"関数 {func.__name__} が終了しました")return resultreturn wrapper@log_functiondefsample():print("サンプル関数の実行")sample()

これを使えば、関数の呼び出し状況を簡単に記録できます。この1と、2を使ってFastAPIを定義するとLog設計などに使えると思います。

3. 引数を持つデコレーター

defrepeat(n):defdecorator(func):defwrapper(*args, **kwargs):for _inrange(n):                func(*args, **kwargs)return wrapperreturn decorator@repeat(3)defsay_hello():print("Hello!")say_hello()

このデコレーターでは@repeat(3) のようにして、関数を3回実行することができます。

クラスに適用するデコレーター

関数だけでなく、クラスにもデコレーターを適用できます。。

defclass_decorator(cls):classNewClass(cls):defhello(self):print("Hello from decorated class!")return NewClass@class_decoratorclassMyClass:defhello(self):print("Hello from original class!")obj = MyClass()obj.hello()

これにより、クラスのメソッドを拡張できます。。

Pythonの標準デコレーター

Pythonにはいくつかの便利な標準デコレーターがあります。

  • @staticmethod → クラス内でインスタンスを作らずに実行できるメソッドを定義
  • @classmethod → クラス自体を引数に取るメソッドを定義
  • @property → ゲッターのように動作するプロパティを定義
classMyClass:def__init__(self, value):        self._value = value@propertydefvalue(self):return self._value@classmethoddefclass_method(cls):print("クラスメソッドが呼ばれました")@staticmethoddefstatic_method():print("スタティックメソッドが呼ばれました")obj = MyClass(10)print(obj.value)# @property によってメソッドのようにアクセスできるMyClass.class_method()MyClass.static_method()

まとめ

デコレーターを使えば、関数やクラスの振る舞いを簡単に拡張できます。

  • デコレーターは関数の前後に処理を追加できる
  • @デコレーター名の形で適用できる
  • 高階関数を使って実装する
  • 標準デコレーターも便利に使える
  • デコレーターを活用すれば、コードをシンプルにしつつ、再利用性を高めることができます。。ぜひ活用してみてください!

    プロフィール
    id:kunio-udid:kunio-udはてなブログPro
    最終更新:

    こんにちは、kunioと申します。40代の文系のプログラマーです。

    ブログでは、主にプログラミングに関する知識や学びをシェアしつつ、子育て奮闘中に日々の生活で感じたことやちょっとした発見、興味深い話題など、雑多なテーマも自由に発信しています。

    広告
    広告
    広告
    A8.net 広告バナーA8.net 広告バナー
    お問い合わせフォーム

    引用をストックしました

    引用するにはまずログインしてください

    引用をストックできませんでした。再度お試しください

    限定公開記事のため引用できません。

    読者です読者をやめる読者になる読者になる

    [8]ページ先頭

    ©2009-2025 Movatter.jp