在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 里,@ 不是注解,而是裝飾器或矩陣運算符。