Python中如何實(shí)現(xiàn)運(yùn)算符的重載,即實(shí)現(xiàn)例如a+b這樣的運(yùn)算符操作呢?
目前累計(jì)服務(wù)客戶超過(guò)千家,積累了豐富的產(chǎn)品開(kāi)發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹(shù)立企業(yè)形象,為客戶提供網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。創(chuàng)新互聯(lián)公司始終以務(wù)實(shí)、誠(chéng)信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過(guò)對(duì)領(lǐng)先技術(shù)的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究、對(duì)客戶形象的視覺(jué)傳遞、對(duì)應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
在C++中可以使用 operator 關(guān)鍵字實(shí)現(xiàn)運(yùn)算符的重載。但是在Python中沒(méi)有類似這樣的關(guān)鍵字,所以要實(shí)現(xiàn)運(yùn)算符的重載,就要用到Python的魔法函數(shù)。Python魔法函數(shù)是以雙下劃線開(kāi)頭,雙下劃線結(jié)尾的一組函數(shù)。我們?cè)陬惗x中最常用到的 __init__ 函數(shù)就是這樣一個(gè)魔法函數(shù),它在創(chuàng)建類對(duì)象時(shí)被自動(dòng)調(diào)用。
下面我們來(lái)看個(gè)簡(jiǎn)單的例子。
上述代碼示例了幾個(gè)魔法函數(shù)的用法。 __add__ 函數(shù)對(duì)應(yīng)了二元運(yùn)算符+,當(dāng)執(zhí)行a+b語(yǔ)句時(shí),python就會(huì)自動(dòng)調(diào)用a. add (b)。 對(duì)于上述例子中的v1+v2+v3,則相當(dāng)于調(diào)用了(v1. add(v2)). add(v3)。
代碼中還有一個(gè)在Python類定義經(jīng)常使用的 __str__ 函數(shù),當(dāng)使用 str() 時(shí)會(huì)被調(diào)用。print函數(shù)對(duì)傳入的參數(shù)都調(diào)用了str()將其轉(zhuǎn)換成易讀的字符串形式,便于打印輸出,因而會(huì)調(diào)用類定義的__str__函數(shù)打出自定義的字符串。
代碼中還有一個(gè)特殊的 __call__ 函數(shù),該函數(shù)在將對(duì)象采用函數(shù)調(diào)用方式使用時(shí)被調(diào)用, 例如v1()相當(dāng)于v1. call ()。
以上就是魔法函數(shù)的基本使用方法。常見(jiàn)的魔法函數(shù)我們可以使用 dir() 函數(shù)來(lái)查看。
輸出結(jié)果為:
上述結(jié)果中形式為‘__函數(shù)名__’的函數(shù)為魔法函數(shù),注意有些對(duì)象也是這種形式,例如__class__, __module__等, 這些不是魔法函數(shù)。具體的魔法函數(shù)說(shuō)明可以參考Python官方說(shuō)明文檔。
以上代碼在Python3.6運(yùn)行通過(guò).
def magic_square(input_file):
import xlrd
data=xlrd.open_workbook(input_file)
sheet1=data.sheet_by_index(0)
i=0
result=[]
diag1=0
diag2=0
while i4:
row=sheet1.row_values(i)
col=sheet1.col_values(i)
add1=0
add2=0
for ele in range(0,len(row)):
add1=add1+row[ele]
add2=add2+row[ele]
result.append(add1)
result.append(add2)
diag1=diag1+row[i]
diag2=diag2+row[3-i]
i=i+1
result.append(diag1)
result.append(diag2)
result=set(result)
if len(result)1:
print('False')
else:
print('True')
注意格式,看下面這個(gè)圖
魔方方法是Python的內(nèi)置方法,無(wú)需主動(dòng)調(diào)用,主要目的就是為了給Python的解釋器進(jìn)行調(diào)用,而且每個(gè)魔方方法都有一個(gè)對(duì)應(yīng)的內(nèi)置函數(shù)或運(yùn)算符,接下來(lái)我們來(lái)看看具體的介紹。
魔法方法就是可以給你的類增加魔力的特殊方法,如果你的對(duì)象實(shí)現(xiàn)(重載)了這些方法中的某一個(gè), 那么這個(gè)方法就會(huì)在特殊的情況下被Python所調(diào)用,你可以定義自己想要的行為,而這一切都是自動(dòng)發(fā) 生的,它們經(jīng)常是兩個(gè)下劃線包圍來(lái)命名的(比如 __init___ , __len__ ),Python的魔法方法是非常強(qiáng)大的所以了解其使用方法也變得尤為重要!
__init__ 構(gòu)造器,當(dāng)一個(gè)實(shí)例被創(chuàng)建的時(shí)候初始化的方法,但是它并不是實(shí)例化調(diào)用的第一個(gè)方法。
__new__ 才是實(shí)例化對(duì)象調(diào)用的第一個(gè)方法,它只取下cls參數(shù),并把其他參數(shù)傳給 __init___。
___new__ 很少使用,但是也有它適合的場(chǎng)景,尤其是當(dāng)類繼承自一個(gè)像元祖或者字符串這樣不經(jīng)常改變的類型的時(shí)候。
__call__ 讓一個(gè)類的實(shí)例像函數(shù)一樣被調(diào)用。
__getitem__ 定義獲取容器中指定元素的行為,相當(dāng)于self[key]。
__getattr__ 定義當(dāng)用戶試圖訪問(wèn)一個(gè)不存在屬性的時(shí)候的行為。
__setattr__ 定義當(dāng)一個(gè)屬性被設(shè)置的時(shí)候的行為。
__getattribute___ 定義當(dāng)一個(gè)屬性被訪問(wèn)的時(shí)候的行為。