7.9 将单方法的类转换为函数
大多数情况下,可以使用闭包来将单个方法的类转换成函数。举个例子,下面示例中的类允许使用者根据某个模板方案来获取到URL链接地址。
- 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'):
大部分情况下,你拥有一个单方法类的原因是需要存储某些额外的状态来给方法使用。比如,定义UrlTemplate类的唯一目的就是先在某个地方存储模板值,以便将来可以在open()方法中使用。
任何时候只要你碰到需要给某个函数增加额外的状态信息的问题,都可以考虑使用闭包。相比将你的函数转换成一个类而言,闭包通常是一种更加简洁和优雅的方案。