Pythonにおける@(アットマーク)の意味
Pythonにおける@記号(アットマーク)は、デコレータと呼ばれる特殊な機能を表すために使用されます。デコレータは関数やメソッド、クラスを別の関数で包み込み、元の定義を変更せずに機能を拡張できる機能です。@演算子は関数やクラスの定義の直前に配置され、その後に続く関数やクラスに装飾を行います。
【サンプルコード】
# シンプルなデコレータの例
def my_decorator(func):
def wrapper():
print("処理の前に何か実行")
func()
print("処理の後に何か実行")
return wrapper
@my_decorator
def say_hello():
print("こんにちは!")
【実行結果】
say_hello()
処理の前に何か実行
こんにちは!
処理の後に何か実行
上記のサンプルコードではmy_decorator
関数がsay_hello
関数をラップし、実行前後に処理を追加しています。@を使わない場合はsay_hello = my_decorator(say_hello)
のように書く必要がありますが、@を使うことで読みやすく記述できます。
行番号 | 詳細説明 |
---|---|
1行目 | デコレータを定義するmy_decorator関数を宣言 |
2行目 | ラッパ関数wrapper内で実行前にprintでメッセージを表示 |
3行目 | ラップされる関数をfunc()で実行 |
4行目 | 実行後のメッセージをprintで表示 |
5行目 | @my_decoratorでsay_hello関数をデコレータで装飾 |
【PR】『Python』を学べる企業・個人向けのプログラミングコース
Pythonの@(アットマーク)を使ったデコレータの応用例
Pythonのデコレータは引数を受け取る形で使用することが可能で、引数付きデコレータを作成するにはデコレータ関数を別の関数でラップする必要があります。この方法によってデコレータの動作をカスタマイズし、より柔軟なコード設計が出来るようになります。
【サンプルコード】
# 引数を取るデコレータの例
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
result = None
for _ in range(n):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"{name}さん、こんにちは!")
return "挨拶完了"
【実行結果】
result = greet("田中")
田中さん、こんにちは!
田中さん、こんにちは!
田中さん、こんにちは!
print(result)
挨拶完了
@repeat(3)というデコレータを使用すると、greet
関数が指定した回数だけ繰り返し呼び出されます。デコレータに引数を渡すことで振る舞いを切り替えられるため、さまざまな関数を汎用的にラップすること可能です。また、*args
や**kwargs
を使えば、引数の形に依存しないデコレータにできます。
行番号 | 詳細説明 |
---|---|
1行目 | repeat関数を定義しデコレータ生成用のdecorator関数を返す |
2行目 | decorator関数がwrapper関数を返す |
3行目 | wrapper関数で指定回数だけfuncを呼び出す |
4行目 | 最終呼び出しの結果をresultに格納し返す |
5行目 | @repeat(3)でgreet関数を装飾し引数を渡すデコレータを適用 |
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
- 【Python】match case(match文)で複数条件を処理する方法
- 【Python】オブジェクト指向を使わないで設計する方法
- 【Python】リスト(list)内包表記におけるifやif elseなどの使い分け
- 【Python】venvのバージョン(version)指定や確認方法