新聞中心
話不多說(shuō),先看代碼:

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到瑞麗網(wǎng)站設(shè)計(jì)與瑞麗網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋瑞麗地區(qū)。
要是你能一下子就看懂,那說(shuō)明你已經(jīng)是 Python 高手了。
要是沒(méi)看懂,我來(lái)解說(shuō)一下(我自己當(dāng)時(shí)也是仔細(xì)研究了一番,才明白)。
首先 F 是一個(gè)類,這個(gè)類有三個(gè)魔法函數(shù):
- __init__ 這就是個(gè)普通的初始化函數(shù),沒(méi)啥特別的
- __call__ 當(dāng)一個(gè)實(shí)例/對(duì)象被當(dāng)作函數(shù)調(diào)用時(shí),這個(gè)函數(shù)會(huì)自動(dòng)調(diào)用,比如 my_f = F() ,那么 my_f(*args,**kwargs) 時(shí)就會(huì)調(diào)用這個(gè)函數(shù)。這里 __call__ 返回的是一個(gè)函數(shù),因此可以推斷出 self.f 是一個(gè)可調(diào)用的函數(shù)。
- __gt__ 這是個(gè)大于號(hào)的自定義運(yùn)算符,當(dāng)兩個(gè)對(duì)象比較時(shí),就會(huì)調(diào)用這個(gè)函數(shù),比如說(shuō) a > b 就相當(dāng)于調(diào)用 a.__gt__(b)。
接下來(lái),我們看到:
@F
def add_two(i):
return i+2
看到 @ 就要想到裝飾器,類 F 實(shí)現(xiàn)了 __call__ 方法,因此可以當(dāng)作裝飾器。
裝飾以后,add_two 就是類 F 的對(duì)象:
>>> add_two
<__main__.F object at 0x7f81cbaa7790>
>>>
add_two(i) 就相當(dāng)于 F(add_two).__call__(i)
接下來(lái)的代碼:
@F
def divide_3_floor(i):
return i // 3
仍然是一個(gè)被裝飾的函數(shù), 裝飾以后 divide_3_floor 就是類 F 的對(duì)象
>>> divide_3_floor
<__main__.F object at 0x7f81cb8687f0>
divide_3_floor(i) 就相當(dāng)于 F(divide_3_floor).__call__(i)
接下來(lái)的代碼:
s = F(str)
說(shuō)明 s 就是一個(gè) F 的對(duì)象,s(i) 就是 s.__call__(i) ,因?yàn)?self.f = str,因此,s.__call__(i) 其實(shí)就是 str(i),可以將一個(gè)變量轉(zhuǎn)化為字符串。
接下來(lái)的代碼比較精彩:
f = add_two > divide_3_floor > s
要知道 a > b > c 是鏈?zhǔn)竭\(yùn)算符,展開(kāi)后是 a > b and b > c, 并不是 (a>b)>c,可以參考前文不可思議,Python 的鏈?zhǔn)讲僮骶谷豢梢赃@樣
這里的 f,我給你展開(kāi)下:
f = add_two > divide_3_floor and divide_3_floor > s
其中 add_two > divide_3_floor 就會(huì)調(diào)用 add_two.__gt__(divide_3_floor) 返回的就是函數(shù):divide_3_floor(add_two(*args,**kwargs))。
同樣的道理:divide_3_floor > s 返回的是 str(divide_3_floor(*args,**kwargs))
因此 f(7) 就是 :
divide_3_floor(add_two(7)) and str(divide_3_floor(7))
其實(shí)就是 :
>>> divide_3_floor(add_two(7)) and str(divide_3_floor(7))
'2'
>>> 3 and '2'
'2'
>>>
Python 里面 A and B 返回的總是 B:
>>> x = object()
>>> y = object()
>>> x and y
因此 3 and '2' 返回的結(jié)果是 '2'。
你看明白了嗎?
標(biāo)題名稱:一段代碼,告訴你什么是裝飾器、可調(diào)用類、自定義運(yùn)算符、函數(shù)式編程
本文地址:http://m.5511xx.com/article/djhiosc.html


咨詢
建站咨詢
