はじめに
Pythonを学んでいると、コード内で 「@」(アットマーク) を見かけることがあるでしょう。特にデコレータ(@staticmethod
など)や、行列演算で使用される @
演算子などが代表的な例です。しかし、初めて見る人にとっては「この記号は何を意味するのか?」と疑問に思うこともあるでしょう。
この記事では、Pythonにおける「@」の役割と使い方について詳しく解説します。具体的には、デコレータ、行列演算、pandasのquery()メソッド などでの利用方法を紹介し、初心者にも分かりやすく説明していきます。
Pythonにおける「@」とは?
Pythonにおいて「@」は、主に 「デコレータ」 として利用されます。デコレータとは、関数やメソッドの動作を変更するための仕組みです。また、Python 3.5 以降では 「@」演算子 が導入され、行列の積を簡潔に表現できるようになりました。さらに、pandasのquery()メソッド において、変数を参照するための「@」の使い方もあります。
「@」の使用例を以下の3つの観点から解説します。
- デコレータ(Decorator):関数やクラスに特定の機能を付加する。
- 行列演算(@ 演算子):NumPy などで行列の積を計算する。
- pandasの query() メソッド:データフレームのクエリ内で変数を参照する。
デコレータ(Decorator)とは?
デコレータの基本
デコレータは、関数やメソッドの前に「@」を付けることで、その関数の動作を変更する仕組み です。主に以下のような用途で使われます。
- ログの記録
- 実行時間の計測
- 関数の動作の制限(例えば認証機能)
デコレータの構文
Pythonでデコレータを使う際の基本的な構文は以下のようになります。
def my_decorator(func):
def wrapper():
print("処理を実行する前")
func()
print("処理を実行した後")
return wrapper
@my_decorator
def my_function():
print("メインの関数が実行されました")
my_function()
デコレータの実行結果
処理を実行する前
メインの関数が実行されました
処理を実行した後
デコレータの実践的な使用例
デコレータは、標準ライブラリにも多く含まれています。例えば、クラスメソッドやスタティックメソッドを定義する際に「@」が使用されます。
@classmethod
クラスメソッドを定義する際には @classmethod
を使います。
class MyClass:
class_variable = "クラス変数"
@classmethod
def class_method(cls):
return f"クラスメソッドが呼ばれました: {cls.class_variable}"
print(MyClass.class_method())
@staticmethod
スタティックメソッドは @staticmethod
を使います。
class MyClass:
@staticmethod
def static_method():
return "スタティックメソッドが呼ばれました"
print(MyClass.static_method())
行列演算における「@」演算子
Python 3.5 以降では、@
演算子が導入されました。これは、行列の積 を簡潔に表現するための演算子です。
NumPyを使った行列の積
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = A @ B
print(C)

pandasのquery()メソッドでの「@」の使用
pandasの query()
メソッドでは、@
を使って変数を参照することができます。
変数を使ったフィルタリング
import pandas as pd
df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35]})
threshold = 30
# thresholdの値を参照する
filtered_df = df.query('age > @threshold')
print(filtered_df)
まとめ
- デコレータ は関数やクラスの動作を変更するために使われる。
- 行列演算の「@」演算子 は、NumPyなどで行列積の計算を簡潔にする。
- pandasの
query()
メソッド では変数参照に「@」を使用できる。
「@」の用途を理解し、適切に活用することで、より効率的なPythonプログラミングが可能になります。