Символ @ в Python имеет два основных применения, и я объясню оба с примерами:
1. Декораторы функций/классов (наиболее распространённое использование):
Представьте, что декоратор — это новогодняя упаковка для подарка. Сам подарок (функция) остаётся неизменным, но мы добавляем к нему дополнительную функциональность (обёртку).
Пример: Добавим логирование к функции: # Декоратор-логгер
def logger(func):
def wrapper(*args, **kwargs):
print(f"Вызов функции {func.__name__}"
return func(*args, **kwargs)
return wrapper
# Применение через @
@logger
def calculate(a, b):
return a + b
# Тест
calculate(2, 3) # Выведет: "Вызов функции calculate" и вернёт 5 Что происходит:
1. @logger эквивалентно calculate = logger(calculate)
2. При вызове calculate() мы фактически вызываем wrapper()
2. Оператор матричного умножения (в научных вычислениях)
Пример с NumPy: import numpy as np
# Создаём матрицы
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# Умножение матриц с помощью @
result = A @ B
# Эквивалентно np.matmul(A, B) Как определить, о чём речь?
1. Если @ стоит перед определением функции/класса — это декоратор
2. Если @ используется между переменными в выражениях — это матричное умножение