如果一个类中除了__init__()方法外只定义了一个其他方法,这样的代码显得不够精简,此时可以使用闭包将它转换为一个闭包函数
举例如下:
使用类来爬取某个网站from urllib.request import urlopenclass 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 yahooyahoo = 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'))使用闭包来完成相同功能def urltemplate(template): def opener(**kwargs): return urlopen(template.format_map(kwargs)) return opener# Example useyahoo = 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')) 大部分情况下,如果单方法类需要存储状态给方法使用,如定义的UrlTemplate类的目的就是先存储模板值状态给open方法使用。对于这种场景,使用内部函数和闭包会显得再优雅一点。闭包的特点就是会保存定义时的环境。