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!")
このコードは、関数の前後に追加の処理を挿入する簡単なデコレータを示しています。
デコレータの適用
@my_decorator
def greet():
print("Greetings!")
このデコレータを使用すると、greet関数は追加のメッセージと共に実行されます。
複数のデコレータの使用
@decorator_one
@decorator_two
def say_bye():
print("Bye!")
複数のデコレータを重ねることで、関数に複数の機能を順番に適用できます。
- 現役エンジニアからスキルを学べる
- 満足度は驚異の97.4%
- 300社以上のIT企業で研修に導入
- 毎日9時〜21時まで、無料カウンセリングを開催中!
引数と戻り値を扱うデコレータ
次に、引数や戻り値を操作する高度なデコレータについて説明します。
これにより、より複雑なロジックを関数に注入することが可能になります。
引数を受け取るデコレータ
def decorator_with_args(func):
def wrapper(*args, **kwargs):
print("Arguments were:", args, kwargs)
return func(*args, **kwargs)
return wrapper
@decorator_with_args
def func_with_args(a, b, c):
print(a, b, c)
このデコレータは、任意の数の引数を受け取り、呼び出される関数に渡すことができます。
戻り値を変更するデコレータ
def square_decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result * result
return wrapper
@square_decorator
def add(a, b):
return a + b
このデコレータは、関数の戻り値を変更して、結果を二乗します。
条件に基づくデコレータ
def condition_decorator(func):
def wrapper(*args, **kwargs):
if args[0] > 10:
return func(*args, **kwargs)
else:
return "Condition not met"
return wrapper
@condition_decorator
def process_data(x):
return x * 2
条件分岐を含むデコレータを使用して、特定の条件下でのみ関数を実行します。
デコレータの実用例と応用
実世界の問題解決にデコレータをどのように応用できるか、具体的な例を通じて説明します。
ログ記録デコレータ
def logging_decorator(func):
def wrapper(*args, **kwargs):
print(f"Logging: {func.__name__} was called with {args} and {kwargs}")
return func(*args, **kwargs)
return wrapper
@logging_decorator
def calculate(x, y):
return x + y
このデコレータは関数が呼び出された際に、その情報をログとして記録します。
パフォーマンス測定デコレータ
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time-start_time:.2f} seconds to run.")
return result
return wrapper
@timing_decorator
def long_running_function():
time.sleep(2)
このデコレータは、関数の実行時間を測定し、パフォーマンスを評価するのに役立ちます。
エラーハンドリングデコレータ
def error_handling_decorator(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
return f"An error occurred: {str(e)}"
return wrapper
@error_handling_decorator
def risky_function():
return 1/0
エラーハンドリングを組み込んだデコレータで、関数実行中の例外を安全に処理します。
プログラミングスクール受講時には教育訓練給付制度を利用することで、受講料の最大80%の給付を受けることが可能です。
デコレータとその他のPython機能との統合
最後に、デコレータを他のPythonの機能とどのように統合できるかを見ていきます。
クラスメソッドとしてのデコレータ
class MyClass:
@staticmethod
def my_static_method():
print("This is a static method.")
@classmethod
def my_class_method(cls):
print("This is a class method, ", cls)
デコレータは、静的メソッドやクラスメソッドとしても使用できます。
イベントドリブンプログラミングへの適用
class Event:
def __init__(self, actions):
self.actions = actions
def happen(self):
for action in self.actions:
action()
@Event
def show_message():
print("Event triggered!")
デコレータを使用して、イベント駆動型のアクションを簡単に管理します。
データ検証デコレータ
def validate_data(func):
def wrapper(data):
if isinstance(data, dict):
return func(data)
else:
return "Invalid data"
@validate_data
def process_data(data):
print("Processing:", data)
データが正しい形式であることを保証するために、バリデーションデコレータを使用します。
- 20000人が学んだpythonの教材
- 正しい情報をまとめて入手
- 様々なゲームを作成しながら楽しくpythonが身に付く
- 自主学習派はこれ一択!
今なら1年間有効なzoomサポート付き!
まとめ: デコレータを使いこなす
この記事では、Pythonのデコレータの基本から応用までを一通り解説しました。これにより、より効率的で読みやすいコードを書くことが可能になります。



コメント