Вопрос-Ответ

What does the "at" (@) symbol do in Python?

Что делает символ "at" (@) в Python?

Что делает символ @ в Python?

Переведено автоматически
Ответ 1

@ Символ в начале строки используется для декораторов классов и функций:

@ В середине строки , вероятно, является матричным умножением:

Ответ 2

Пример

class Pizza(object):
def __init__(self):
self.toppings = []

def __call__(self, topping):
# When using '@instance_of_pizza' before a function definition
# the function gets passed onto 'topping'.
self.toppings.append(topping())

def __repr__(self):
return str(self.toppings)

pizza = Pizza()

@pizza
def cheese():
return 'cheese'
@pizza
def sauce():
return 'sauce'

print pizza
# ['cheese', 'sauce']

Это показывает, что function/method/class, который вы определяете после декоратора, просто передается как argument знаку function/method сразу после @ знака.

Первое наблюдение

В микрофрейме Flask с самого начала представлены декораторы в следующем формате:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return "Hello World!"

Это, в свою очередь, переводится как:

rule      = "/"
view_func = hello
# They go as arguments here in 'flask/app.py'
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
pass

Осознание этого, наконец, позволило мне почувствовать себя в мире с Flask.

Ответ 3

В Python 3.5 вы можете выполнять перегрузку @ как оператор. Он назван как __matmul__, потому что он предназначен для выполнения матричного умножения, но это может быть все, что вы хотите. Подробнее см. в PEP465.

Это простая реализация матричного умножения.

class Mat(list):
def __matmul__(self, B):
A = self
return Mat([[sum(A[i][k]*B[k][j] for k in range(len(B)))
for j in range(len(B[0])) ] for i in range(len(A))])

A = Mat([[1,3],[7,5]])
B = Mat([[6,8],[4,2]])

print(A @ B)

Этот код выдает:

[[18, 14], [62, 66]]
Ответ 4

Этот фрагмент кода:

def decorator(func):
return func

@decorator
def some_func():
pass

Эквивалентно этому коду:

def decorator(func):
return func

def some_func():
pass

some_func = decorator(some_func)

В определение декоратора вы можете добавить некоторые измененные элементы, которые обычно не возвращаются функцией.

python