def__call__(self, topping): # When using '@instance_of_pizza' before a function definition # the function gets passed onto 'topping'. self.toppings.append(topping())
Это показывает, что function/method/class, который вы определяете после декоратора, просто передается как argument знаку function/method сразу после @ знака.
Первое наблюдение
В микрофрейме Flask с самого начала представлены декораторы в следующем формате:
from flask import Flask app = Flask(__name__)
@app.route("/") defhello(): return"Hello World!"
Это, в свою очередь, переводится как:
rule = "/" view_func = hello # They go as arguments here in 'flask/app.py' defadd_url_rule(self, rule, endpoint=None, view_func=None, **options): pass
Осознание этого, наконец, позволило мне почувствовать себя в мире с Flask.
Ответ 3
В Python 3.5 вы можете выполнять перегрузку @ как оператор. Он назван как __matmul__, потому что он предназначен для выполнения матричного умножения, но это может быть все, что вы хотите. Подробнее см. в PEP465.
Это простая реализация матричного умножения.
classMat(list): def__matmul__(self, B): A = self return Mat([[sum(A[i][k]*B[k][j] for k inrange(len(B))) for j inrange(len(B[0])) ] for i inrange(len(A))])
A = Mat([[1,3],[7,5]]) B = Mat([[6,8],[4,2]])
print(A @ B)
Этот код выдает:
[[18, 14], [62, 66]]
Ответ 4
Этот фрагмент кода:
defdecorator(func): return func
@decorator defsome_func(): pass
Эквивалентно этому коду:
defdecorator(func): return func
defsome_func(): pass
some_func = decorator(some_func)
В определение декоратора вы можете добавить некоторые измененные элементы, которые обычно не возвращаются функцией.