协慌网

登录 贡献 社区

Python 中的 “@”(@)符号有什么作用?

我正在看一些使用@符号的 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 和平相处。

行开头的@符号用于类,函数和方法修饰符

在这里阅读更多:

PEP 318:装饰器

Python 装饰器

您会遇到的最常见的 Python 装饰器是:

@财产

@classmethod

@staticmethod

如果您@ ,那是另一回事,矩阵乘法。请参阅此答案,以显示@作为二进制运算符的用法。

此代码段:

def decorator(func):
   return func

@decorator
def some_func():
    pass

等效于以下代码:

def decorator(func):
    return func

def some_func():
    pass

some_func = decorator(some_func)

在装饰器的定义中,您可以添加一些通常不会由函数返回的修改内容。