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

949 投票
14 回答
711933 浏览
提问于 2025-04-16 19:48

在Python中,@符号的作用是什么呢?

14 个回答

310

在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]]
450

示例

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']

这段话的意思是,你在装饰器后面定义的函数/方法/,其实就是被当作一个参数传递给紧接着@符号后面的函数/方法

首次出现

微框架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感到安心。

573

在一行的开头出现的@符号是用来表示类和函数的装饰器的:

如果@出现在一行的中间,那可能是在进行矩阵乘法:

撰写回答