Solución:
Ejemplo
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']
Esto muestra que el function
/method
/class
estás definiendo después de un decorador se transmite básicamente como un argument
al function
/method
inmediatamente después de la @
firmar.
Primer avistamiento
El microframework Matraz introduce decoradores desde el principio en el siguiente formato:
from flask import Flask
app = Flask(__name__)
@app.route("https://foroayuda.es/")
def hello():
return "Hello World!"
Esto a su vez se traduce en:
rule = "https://foroayuda.es/"
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
Darme cuenta de esto finalmente me permitió sentirme en paz con Flask.
Un @
El símbolo al principio de una línea se usa para clase, función y método. decoradores.
Leer más aquí:
PEP 318: Decoradores
Decoradores de Python
Los decoradores de Python más comunes con los que te encontrarás son:
@propiedad
@classmethod
@staticmethod
Si ves un @
en el medio de una línea, eso es algo diferente, multiplicación de matrices. Vea esta respuesta que muestra el uso de @
como operador binario.
Este fragmento de código:
def decorator(func):
return func
@decorator
def some_func():
pass
Es equivalente a este código:
def decorator(func):
return func
def some_func():
pass
some_func = decorator(some_func)
En la definición de un decorador, puede agregar algunas cosas modificadas que no serían devueltas por una función normalmente.