當前位置:首頁 » 編程語言 » python操作符重載

python操作符重載

發布時間: 2023-01-01 15:31:04

python怎麼重載運算符

自定義類在+右邊的時候,需要定義 __radd__(self, other) 方法。如果左側的obj沒有定義__add__,那麼python會自動調用右側obj的__radd__。
其它運算符也是這樣的。都是前面加個r表示右側,例如__rmul__

㈡ python運算符重載問題

將__div__換成__truediv__試試
因為在python 2.x.x 裡面 / 是classic division 所以LOVESOO的回答沒有問題
在python 3.x.x / 對應的是 true division 所以試試定義 __truediv__
http://legacy.python.org/dev/peps/pep-0238/ 搜 API Changes

㈢ Python正確重載運算符的方法示例詳解

Python正確重載運算符的方法示例詳解
說到運算符重載相信大家都不陌生,運算符重載的作用是讓用戶定義的對象使用中綴運算符(如 + 和 |)或一元運算符(如 - 和 ~)。說得寬泛一些,在 Python 中,函數調用(())、屬性訪問(.)和元素訪問 / 切片([])也是運算符。
我們為 Vector 類簡略實現了幾個運算符。__add__ 和 __mul__ 方法是為了展示如何使用特殊方法重載運算符,不過有些小問題被我們忽視了。此外,我們定義的Vector2d.__eq__ 方法認為 Vector(3, 4) == [3, 4] 是真的(True),這可能並不合理。下面來一起看看詳細的介紹吧。

運算符重載基礎
在某些圈子中,運算符重載的名聲並不好。這個語言特性可能(已經)被濫用,讓程序員困惑,導致缺陷和意料之外的性能瓶頸。但是,如果使用得當,API 會變得好用,代碼會變得易於閱讀。Python 施加了一些限制,做好了靈活性、可用性和安全性方面的平衡:
不能重載內置類型的運算符
不能新建運算符,只能重載現有的
某些運算符不能重載——is、and、or 和 not(不過位運算符
&、| 和 ~ 可以)

前面的博文已經為 Vector 定義了一個中綴運算符,即 ==,這個運算符由__eq__ 方法支持。我們將改進 __eq__ 方法的實現,更好地處理不是Vector 實例的操作數。然而,在運算符重載方面,眾多比較運算符(==、!=、>、<、>=、<=)是特例,因此我們首先將在 Vector 中重載四個算術運算符:一元運算符 - 和 +,以及中綴運算符 + 和 *。

一元運算符

-(__neg__)

一元取負算術運算符。如果 x 是 -2,那麼 -x == 2。

+(__pos__)

一元取正算術運算符。通常,x == +x,但也有一些例外。如果好奇,請閱讀「x 和 +x 何時不相等」附註欄。

~(__invert__)

對整數按位取反,定義為 ~x == -(x+1)。如果 x 是 2,那麼 ~x== -3。

支持一元運算符很簡單,只需實現相應的特殊方法。這些特殊方法只有一個參數,self。然後,使用符合所在類的邏輯實現。不過,要遵守運算符的一個基本規則:始終返回一個新對象。也就是說,不能修改self,要創建並返回合適類型的新實例。
對 - 和 + 來說,結果可能是與 self 同屬一類的實例。多數時候,+ 最好返回 self 的副本。abs(...) 的結果應該是一個標量。但是對 ~ 來說,很難說什麼結果是合理的,因為可能不是處理整數的位,例如在ORM 中,SQL WHERE 子句應該返回反集。
def __abs__(self):
return math.sqrt(sum(x * x for x in self))

def __neg__(self):
return Vector(-x for x in self) #為了計算 -v,構建一個新 Vector 實例,把 self 的每個分量都取反

def __pos__(self):
return Vector(self) #為了計算 +v,構建一個新 Vector 實例,傳入 self 的各個分量

x 和 +x 何時不相等

每個人都覺得 x == +x,而且在 Python 中,幾乎所有情況下都是這樣。但是,我在標准庫中找到兩例 x != +x 的情況。

第一例與 decimal.Decimal 類有關。如果 x 是 Decimal 實例,在算術運算的上下文中創建,然後在不同的上下文中計算 +x,那麼 x!= +x。例如,x 所在的上下文使用某個精度,而計算 +x 時,精度變了,例如下面的

㈣ Python魔法函數(特殊函數)

Python中如何實現運算符的重載,即實現例如a+b這樣的運算符操作呢?

在C++中可以使用 operator 關鍵字實現運算符的重載。但是在Python中沒有類似這樣的關鍵字,所以要實現運算符的重載,就要用到Python的魔法函數。Python魔法函數是以雙下劃線開頭,雙下劃線結尾的一組函數。我們在類定義中最常用到的 __init__ 函數就是這樣一個魔法函數,它在創建類對象時被自動調用。

下面我們來看個簡單的例子。

上述代碼示例了幾個魔法函數的用法。 __add__ 函數對應了二元運算符+,當執行a+b語句時,python就會自動調用a. add (b)。 對於上述例子中的v1+v2+v3,則相當於調用了(v1. add(v2)). add(v3)。

代碼中還有一個在Python類定義經常使用的 __str__ 函數,當使用 str() 時會被調用。print函數對傳入的參數都調用了str()將其轉換成易讀的字元串形式,便於列印輸出,因而會調用類定義的__str__函數打出自定義的字元串。

代碼中還有一個特殊的 __call__ 函數,該函數在將對象採用函數調用方式使用時被調用, 例如v1()相當於v1. call ()。

以上就是魔法函數的基本使用方法。常見的魔法函數我們可以使用 dir() 函數來查看。

輸出結果為:

上述結果中形式為『__函數名__』的函數為魔法函數,注意有些對象也是這種形式,例如__class__, __mole__等, 這些不是魔法函數。具體的魔法函數說明可以參考Python官方說明文檔。

以上代碼在Python3.6運行通過.

㈤ python 運算符重載

自定義類在+右邊的時候,需要定義 __radd__(self, other) 方法。如果左側的obj沒有定義__add__,那麼python會自動調用右側obj的__radd__。
其它運算符也是這樣的。都是前面加個r表示右側,例如__rmul__

熱點內容
未上傳圖片 發布:2025-07-02 22:14:01 瀏覽:597
安卓qq直播怎麼分享聲音 發布:2025-07-02 22:13:21 瀏覽:248
安卓系統怎麼刷機清除內存 發布:2025-07-02 22:08:19 瀏覽:696
安卓手機6位數密碼有多少組 發布:2025-07-02 21:50:31 瀏覽:797
存儲卡視頻多了 發布:2025-07-02 21:49:40 瀏覽:850
ajax無刷新上傳圖片 發布:2025-07-02 21:32:56 瀏覽:117
編譯器不認pow函數 發布:2025-07-02 21:27:04 瀏覽:339
w10隱藏文件夾 發布:2025-07-02 21:27:03 瀏覽:534
電腦d盤拒絕訪問 發布:2025-07-02 21:27:02 瀏覽:779
pythonif字元串比較大小 發布:2025-07-02 21:23:18 瀏覽:127