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+ 引入了 @
作为矩阵乘法运算符,主要用于 numpy
或 torch
计算。
示例 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. @
在 dataclass
及 ABC
中的用法
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!"
@abstractmethod
让 Animal
变成抽象类,子类必须实现 speak
方法,否则会报错。总结
用法 | 作用 |
---|---|
@decorator |
函数/类装饰器,用于增强功能 |
@staticmethod |
定义静态方法,不依赖实例 |
@classmethod |
定义类方法,可以访问类变量 |
@property |
把方法变成只读属性 |
@dataclass |
自动生成 __init__ 、__repr__ 等方法 |
@abstractmethod |
定义抽象方法,子类必须实现 |
@ (矩阵乘法) |
numpy 、torch 矩阵运算 |
如果你主要关注某一部分的应用,欢迎进一步讨论!
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: int
和 y: 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首席体验官