W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你有一個(gè)除 __init__()
方法外只定義了一個(gè)方法的類。為了簡化代碼,你想將它轉(zhuǎn)換成一個(gè)函數(shù)。
大多數(shù)情況下,可以使用閉包來將單個(gè)方法的類轉(zhuǎn)換成函數(shù)。舉個(gè)例子,下面示例中的類允許使用者根據(jù)某個(gè)模板方案來獲取到URL鏈接地址。
from urllib.request import urlopen
class UrlTemplate:
def __init__(self, template):
self.template = template
def open(self, **kwargs):
return urlopen(self.template.format_map(kwargs))
# Example use. Download stock data from yahoo
yahoo = UrlTemplate('http://finance.yahoo.com/d/quotes.csv?s={names}&f={fields}')
for line in yahoo.open(names='IBM,AAPL,FB', fields='sl1c1v'):
print(line.decode('utf-8'))
這個(gè)類可以被一個(gè)更簡單的函數(shù)來代替:
def urltemplate(template):
def opener(**kwargs):
return urlopen(template.format_map(kwargs))
return opener
# Example use
yahoo = urltemplate('http://finance.yahoo.com/d/quotes.csv?s={names}&f={fields}')
for line in yahoo(names='IBM,AAPL,FB', fields='sl1c1v'):
print(line.decode('utf-8'))
大部分情況下,你擁有一個(gè)單方法類的原因是需要存儲(chǔ)某些額外的狀態(tài)來給方法使用。比如,定義UrlTemplate類的唯一目的就是先在某個(gè)地方存儲(chǔ)模板值,以便將來可以在open()方法中使用。
使用一個(gè)內(nèi)部函數(shù)或者閉包的方案通常會(huì)更優(yōu)雅一些。簡單來講,一個(gè)閉包就是一個(gè)函數(shù),只不過在函數(shù)內(nèi)部帶上了一個(gè)額外的變量環(huán)境。閉包關(guān)鍵特點(diǎn)就是它會(huì)記住自己被定義時(shí)的環(huán)境。因此,在我們的解決方案中,opener()
函數(shù)記住了 template
參數(shù)的值,并在接下來的調(diào)用中使用它。
任何時(shí)候只要你碰到需要給某個(gè)函數(shù)增加額外的狀態(tài)信息的問題,都可以考慮使用閉包。相比將你的函數(shù)轉(zhuǎn)換成一個(gè)類而言,閉包通常是一種更加簡潔和優(yōu)雅的方案。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: