【Python从入门到精通】--‘@‘符号的作用
在Python中,@
符号主要有三种用途:装饰器(Decorator)、矩阵乘法运算符(Python 3.5+)以及类型提示中的修饰符(如@typing
)。
目录
1.@--装饰器(Decorator)
2.@--矩阵乘法运算符
3.@--类中的特殊用法
1.@--装饰器(Decorator)
最常见的用途,用于修改或扩展函数/类的行为,通过@decorator_name
语法实现。
说白了就是函数的多重调用:
def logger(func):def wrapper(*args, **kwargs):print(f"调用函数: {func.__name__}")return func(*args, **kwargs)return wrapper@logger # 等价于 my_func = logger(my_func)
def my_func(x):return x * 2print(my_func(3)) # 输出: 调用函数: my_func → 6
@logger在函数上面的意思就是my_func作为参数传给logger后再赋值给my_func,
那么我们在调用my_func(3)=logger(my_func(3))=logger(6)=6,
注意这里的my_func是一个函数参数,那如果logger本身有参数怎么办?
def repeat(n_times): # 外层接收装饰器参数def decorator(func): # 中层接收被装饰函数def wrapper(*args, **kwargs): # 内层实现逻辑for _ in range(n_times):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator@repeat(n_times=3) # 传入参数 n_times=3
def greet(name):print(f"Hello, {name}!")#greet("Alice")=repeat(n_times=3)(greet)("Alice")
greet("Alice")
# 输出:
# Hello, Alice!
# Hello, Alice!
# Hello, Alice!
相当于,greet("Alice")=repeat(n_times=3,func=greet("Alice"))介接收了两个参数,原本参数,和修饰器参数
2.@--矩阵乘法运算符
Python 3.5+ 引入了 @
作为矩阵乘法运算符,主要用于 numpy
或 torch
计算。
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A @ B) # 输出矩阵乘积
# [[19 22]
# [43 50]]
3.@--类中的特殊用法
在类定义中,@
主要用于类方法、静态方法和属性装饰器。
class Math:@staticmethoddef add(a, b):return a + bprint(Math.add(3, 5)) # 8
8
@staticmethod
定义静态方法,不依赖实例,直接通过类调用。
装饰器 | 作用描述 | 关键特性 | 示例场景 |
---|---|---|---|
@staticmethod | 定义静态方法 | 不依赖实例/类,直接通过类调用 无 self 或cls 参数 | 工具类方法(如数学计算) |
@classmethod | 定义类方法 | 第一个参数是cls 可修改类变量或实现替代构造器 | 工厂模式、类配置修改 |
@property | 将方法转为属性 | 只读访问(默认) 需配合 @属性名.setter 实现写操作 | 封装私有变量、计算属性 |
@dataclass | 自动生成数据类方法 | 自动添加__init__ 、__repr__ 等支持类型注解和默认值 | 数据容器、DTO对象 |
@abstractmethod | 定义抽象方法 | 强制子类实现该方法 类必须继承 ABC | 接口规范、框架设计 |
,在 Python 里,@ 不是注解,而是装饰器或矩阵运算符。