Python中`@`符号的作用及注解含义解析

1. Python 中的 @ 符号

@ 在 Python 中有多个用途,主要包括装饰器矩阵乘法特殊语法,具体解释如下:


1. @ 作为装饰器 (Decorator)

装饰器是 Python 中的一种特殊语法,用于修改函数或类的行为。@ 符号后面跟一个装饰器函数,用于增强或修改被装饰的函数或类的功能。

示例 1.1:函数装饰器

def decorator(func):
    def wrapper():
        print("执行前")
        func()
        print("执行后")
    return wrapper

@decorator  # 这相当于 `say_hello = decorator(say_hello)`
def say_hello():
    print("Hello, Python!")

say_hello()

输出:

执行前
Hello, Python!
执行后
  • @decorator 作用于 say_hello,使其在执行前后都打印额外的信息。
  • 示例 1.2:带参数的装饰器

    def repeat(n):
        def decorator(func):
            def wrapper(*args, **kwargs):
                for _ in range(n):
                    func(*args, **kwargs)
            return wrapper
        return decorator
    
    @repeat(3)  # 传入参数,重复执行3次
    def greet():
        print("Hello!")
    
    greet()
    

    输出:

    Hello!
    Hello!
    Hello!
    
  • 这里 repeat(3) 先返回 decorator,然后装饰 greet 函数,使其执行 3 次。

  • 2. @ 作为矩阵乘法运算符

    Python 3.5+ 引入了 @ 作为矩阵乘法运算符,主要用于 numpytorch 计算。

    示例 2.1:NumPy 矩阵乘法

    import numpy as np
    
    A = np.array([[1, 2], [3, 4]])
    B = np.array([[5, 6], [7, 8]])
    
    C = A @ B  # 等价于 np.dot(A, B)
    print(C)
    

    输出:

    [[19 22]
     [43 50]]
    
  • @ 等价于 np.dot(A, B),执行矩阵乘法。
  • 示例 2.2:PyTorch 矩阵乘法

    import torch
    
    A = torch.tensor([[1, 2], [3, 4]])
    B = torch.tensor([[5, 6], [7, 8]])
    
    C = A @ B
    print(C)
    

    输出:

    tensor([[19, 22],
            [43, 50]])
    
  • torch 中,@ 也是执行矩阵乘法的快捷方式。

  • 3. @ 在类中的特殊用法

    在类定义中,@ 主要用于类方法、静态方法和属性装饰器

    示例 3.1:@staticmethod

    class Math:
        @staticmethod
        def add(a, b):
            return a + b
    
    print(Math.add(3, 5))  # 8
    
  • @staticmethod 定义静态方法,不依赖实例,直接通过类调用。
  • 示例 3.2:@classmethod

    class Example:
        class_var = "类变量"
    
        @classmethod
        def change_var(cls, value):
            cls.class_var = value
    
    Example.change_var("新值")
    print(Example.class_var)  # "新值"
    
  • @classmethod 作用于类方法,第一个参数是类本身,可以修改类变量。
  • 示例 3.3:@property

    class Person:
        def __init__(self, name):
            self._name = name
    
        @property
        def name(self):
            return self._name
    
    p = Person("Alice")
    print(p.name)  # Alice
    # p.name = "Bob"  # 会报错,因为 `@property` 使 `name` 变为只读
    
  • @property 将方法变成只读属性,防止外部修改 _name

  • 4. @dataclassABC 中的用法

    Python 3.7+ 引入 @dataclass,用于自动生成 __init____repr__ 等方法。

    示例 4.1:@dataclass

    from dataclasses import dataclass
    
    @dataclass
    class Point:
        x: int
        y: int
    
    p = Point(3, 4)
    print(p)  # Point(x=3, y=4)
    
  • @dataclass 自动生成 __init____repr__ 等方法,简化类定义。
  • 示例 4.2:@abstractmethod

    from abc import ABC, abstractmethod
    
    class Animal(ABC):
        @abstractmethod
        def speak(self):
            pass
    
    class Dog(Animal):
        def speak(self):
            return "Woof!"
    
    d = Dog()
    print(d.speak())  # "Woof!"
    
  • @abstractmethodAnimal 变成抽象类,子类必须实现 speak 方法,否则会报错。

  • 总结

    用法 作用
    @decorator 函数/类装饰器,用于增强功能
    @staticmethod 定义静态方法,不依赖实例
    @classmethod 定义类方法,可以访问类变量
    @property 把方法变成只读属性
    @dataclass 自动生成 __init____repr__ 等方法
    @abstractmethod 定义抽象方法,子类必须实现
    @ (矩阵乘法) numpytorch 矩阵运算

    如果你主要关注某一部分的应用,欢迎进一步讨论!

    2. 答疑解惑

    2.1. Python @没有注解的意思吗

    Python 中的 @ 符号不用于注解,但可能会与类型注解(Type Hints)混淆。例如,Python 的类型注解使用的是 :->,而不是 @


    1. Python 的类型注解(与 @ 无关)

    Python 提供类型注解来指定变量、函数参数和返回值的类型,例如:

    def add(x: int, y: int) -> int:
        return x + y
    
    age: int = 25
    
  • x: inty: int 指定参数类型
  • -> int 指定返回值类型
  • age: int = 25 指定变量类型

  • 2. @ 不是注解,而是装饰器

    在 Python 中,@ 主要用于装饰器,例如:

    @staticmethod
    def my_function():
        pass
    

    这里的 @staticmethod装饰器,用于修饰 my_function,但不是类型注解


    3. @ 在 Python 中没有"注解"的作用

    在某些编程语言(如 Java),@ 符号用于注解(Annotations),例如:

    @Override
    public void myMethod() { ... }
    

    但 Python 没有类似 Java 的注解概念,@ 主要用于装饰器矩阵运算(如 numpy 矩阵乘法)。

    如果你的问题是关于 Python 中如何做代码注释,可以使用 #""" """

    # 这是单行注释
    
    """
    这是多行注释
    或者文档字符串
    """
    

    所以,在 Python 里,@ 不是注解,而是装饰器矩阵运算符

    作者:AI Agent首席体验官

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中`@`符号的作用及注解含义解析

    发表回复