| 極客饕餮 2018-09-21 13:00:14 一 魔術(shù)方法與操作符重載魔術(shù)方法是在名稱的開始和結(jié)尾都有雙下劃線的特殊方法. 它們也被稱為dunders __init__就是魔術(shù)方法,還有其他幾個,它們被用來創(chuàng)建不能用普通方法表示的功能. 魔術(shù)方法的一個常見功能就是運算符重載 這意味著為自定義類定義運算符,允許使用+和*等運算符 比如,使用魔術(shù)方法__add__重載+ class Vector2D: 結(jié)果: 8 16 __add__方法允許為我們的類中的+運算符定義自定義的功能. 上面的例子中,+添加了對象的相應(yīng)屬性并返回一個包含結(jié)果的新對象. 一旦定義了,我們就可以將這個類的兩個對象相加. 常見的魔術(shù)方法: __sub__:對應(yīng)- __mul__:對應(yīng)* __truediv__:對應(yīng)/ __floordiv__對應(yīng)// __mod__對應(yīng)% __pow__對應(yīng)** __and__對應(yīng)& __xor__對應(yīng)^ __or__對應(yīng)| 表達(dá)式x+y被翻譯為x.__add__(y) 然而,如果x沒有實現(xiàn)__add__,并且x和y的類型不同,則調(diào)用y.__radd__(x) 對于剛剛提到的所有魔術(shù)方法,都有等價的方法. 例如: class SpecialString: 結(jié)果: python也為比較運算符提供了魔術(shù)方法. __lt__對應(yīng)小于(low than) __gt__對應(yīng)大于(great than) __eq__對應(yīng)等于(equals) __ne__對應(yīng)不等于 __le__對應(yīng)小于等于 __ge__對應(yīng)大于等于 有幾個神奇的方法使類像容器一樣行事 __len__對應(yīng)len() __getitem__對應(yīng) 獲取索引 __setitem__對應(yīng) 分配索引 __delitem__對應(yīng) 刪除索引 __iter__對應(yīng) 迭代對象(例如for循環(huán)) __contains__ 對應(yīng) in 還有很多其他的魔術(shù)方法,比如講__call__作為函數(shù)調(diào)用對象,__int__,__str__等等,將對象轉(zhuǎn)換為內(nèi)建類型. 例如: import random 結(jié)果: 我們重寫了類VagueList的len()函數(shù)來返回一個隨機(jī)數(shù) 索引函數(shù)還根據(jù)表達(dá)式從列表中返回一個范圍內(nèi)的隨機(jī)項目 | 
|  |