この記事は広告を含みます。
Pythonの「デコレーター」という機能を知っていますか?デコレーターは、関数やクラスの動作を簡単に拡張できる強力な仕組みです。
この記事では、デコレーターの基本から応用までを徹底解説します。。
デコレーターとは、関数の前後に処理を追加するための仕組み です。Pythonでは、関数を引数として受け取り、新しい関数を返す「高階関数」を利用してデコレーターを実装します。。
例えば、ログを記録する処理を関数の前後に追加したい場合、デコレーターを使うとスマートに実装できます。
Pythonでデコレーターを作る基本構文を見てみましょう。
defmy_decorator(func):defwrapper():print("前処理: 関数を実行する前に動作") func()print("後処理: 関数を実行した後に動作")return wrapper@my_decorator# デコレーターを適用defmy_function():print("メインの関数が実行されました")my_function()
前処理: 関数を実行する前に動作メインの関数が実行されました後処理: 関数を実行した後に動作
このように、@デコレーター名
を関数の前に記述することで、デコレーターを適用できます。
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()
このデコレーターを使えば、関数の実行時間を簡単に測定できます。
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設計などに使えると思います。
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にはいくつかの便利な標準デコレーターがあります。
@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()
デコレーターを使えば、関数やクラスの振る舞いを簡単に拡張できます。
デコレーターを活用すれば、コードをシンプルにしつつ、再利用性を高めることができます。。ぜひ活用してみてください!
こんにちは、kunioと申します。40代の文系のプログラマーです。
ブログでは、主にプログラミングに関する知識や学びをシェアしつつ、子育て奮闘中に日々の生活で感じたことやちょっとした発見、興味深い話題など、雑多なテーマも自由に発信しています。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。