日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一段代碼,告訴你什么是裝飾器、可調(diào)用類、自定義運(yùn)算符、函數(shù)式編程

話不多說(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

>>> y

>>> x

>>>

因此 3 and '2' 返回的結(jié)果是 '2'。

你看明白了嗎?


標(biāo)題名稱:一段代碼,告訴你什么是裝飾器、可調(diào)用類、自定義運(yùn)算符、函數(shù)式編程
本文地址:http://m.5511xx.com/article/djhiosc.html