python中 符的用法

2021-09-12 01:57:33 字數 2056 閱讀 4959

python中目前@有兩種用法,乙個是用於裝飾器,乙個是用於矩陣乘法的過載符

# 用法一:語法糖

# 在python2.x和<=3.4版本中,@只用作裝飾器,用法如下:

@a_decorate_func # 其實此處只要是乙個可以使用()呼叫語法的識別符號即可

deffun

(*args,

**kargs)

:pass

# 上面的**與下面的**效果是一樣的,為了我們寫**方便,才提供了上面的語法

# 我猜測可能不止效果一樣,最終的**都是一樣的,直譯器會先將上面的**直接變成下面的**

deffun

(*args,

**kargs)

:pass

fun = a_decorate_func(fun)

# 也就是說用於裝飾器的@符,其實只是乙個簡單的**替換(我猜是編譯器會將上面的@用法

# 直接替換成下面的**,官方文件上也是說它們是等價的,但是沒有具體說明原理)

# 我這樣子猜測也是有原因的,因為我測試過,只要@後面跟乙個能夠使用()的識別符號就可以,

# 比如是乙個函式,或者是乙個callable例項物件,或者是類名(該類不一定要實現__callable__())

# 它們三這有乙個共同的特徵,就是後面可以直接跟(),並且如果類a實現了__callable__(),

# 則@a()的寫法也是可以的,此處就更明顯了,直譯器會先執行a(),返回以a的例項物件,然後就和

# @後面直接跟乙個例項物件是一樣的了,這就是說@a()的寫法中,a()會先被執行,然後取得其結果

# 此時只有認為直譯器確實是將@a()替換成fun=a()(fun)才比較合理,此時a()才會被先執行一下

# 用法二:矩陣乘法

# 此用法只能是在》=python3.5中使用,python2中不能用

# 此用法其實就是操作符過載,直譯器會把@運算轉換成對__matmul__()方法的呼叫

# 所以要使用@作為矩陣乘法,則這個類必須實現__matmul__()方法噢

# 舉個栗子

classa:

def__init__

(self, val)

: self.val = val

def__matmul__

(self, b)

:# 定義與@符號繫結的函式

print

("in __matmul__ a"

, self.val, b.val)

def__mul__

(self, b)

:# 定義與*符號繫結的函式

print

("in __mul__ a"

, self.val, b)

def__rmul__

(self, b)

:# 定義右乘,即a類對像在*右側,且*左側不是a物件時呼叫

print

("in __rmul__ a"

, self.val, b)

a = a(

100)

b = a(

200)

a@b #out: in __matmul__ a 100 200

a*b #out: in __mul__ a 100 <__main__.a object at 0x7f8aca1f16d8>

a*10

#out: in __mul__ a 100 10

10*a #out: in __rmul__ a 100 10

# 當然我上面只是為了驗證@和*所繫結的方法是哪些,實際應用中還是要根據需要來定義這些方法的

# 比如@一般是用於矩陣乘法,實現__matmul__時,就要根據你的需求來實現矩陣乘法,而不是像我

# 上面寫的那樣,直接print一下了.

好啦,python中的@目前應該就只有這兩種用法了,小夥伴兒們現在是不是清晰了呢?

裝飾器部分的知識講的比較少,不太理解也沒關係的,只要記得有這麼回事就好啦

Python中操作符過載用法分析

類可以過載python的操作符 操作符過載使我們的物件與內建的一樣。x 的名字的方法是特殊的掛鉤 hook python通過這種特殊的命名來攔截操作符,以實現過載。python在計算操作符時會自動呼叫這樣的方法,例如 如果物件繼承了 add 方法,當它出現在 表示式中時會呼叫這個方法。通過過載,使用...

python中with的用法

剛剛開始學python,今天在乙個基礎例子中看到了一行 覺得很有意思,就去研究了一下 with open config name login.txt r as f 其實這是python中的with語句,類似於php中的try catch 主要是用來檔案處理,你需要的是獲取乙個檔案控制代碼,然後從檔案...

python中with的用法

python中with的用法 清單 1.with 語句的語法格式 1 2 with context expression as target s with body 無論context expression是否發生異常,都能保證不報錯,類似於try finally正規化。enter 語句返回值賦給t...