问题:我们有一个定义了一个方法的类(__init__()
除外)。但是,为了简化代码,我们希望用一个简单的函数替代
解决方案:只有单个方法的类可以通过闭包将其转换成函数
示例:现有一个类,允许通过某种模板方案来获取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))
# 使用示例:
bd = UrlTemplate('http://www.baidu.com?s={name}&f={fields}')
for line in bd.open(name='1', fields='2'):
print(line.decode())
上面那个类可以用一个简单的函数来替代:
def urltemplate(template):
def open(**kwargs):
return urlopen(template.format_map(kwargs))
return open
# 使用示例:
bd = urltemplate('http://www.baidu.com?s={name}&f={fields}')
for line in bd(name='1', fields='2'):
print(line.decode())
总结:
1、在许多情况下,我们会使用单个方法的类的唯一原因就是保存额外的状态给类方法使用;
2、闭包就是一个函数,但是它还保存着额外的变量环境,使得这些变量可以在函数中使用;
3、闭包的核心特性就是它可以记住定义闭包时的环境。