我正在看一些使用@
符号的 Python 代码,但我不知道它的作用。我也不知道要搜索什么,因为搜索 Python 文档时会出现,或者当包含@
符号时 Google 不会返回相关结果。
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 和平相处。
此代码段:
def decorator(func):
return func
@decorator
def some_func():
pass
等效于以下代码:
def decorator(func):
return func
def some_func():
pass
some_func = decorator(some_func)
在装饰器的定义中,您可以添加一些通常不会由函数返回的修改内容。