闭包(closure) --用函数替代只有单个方法的类

问题:我们有一个定义了一个方法的类(__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、闭包的核心特性就是它可以记住定义闭包时的环境。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,803评论 1 32
  • 本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...
    寒桥阅读 5,442评论 0 3
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 7,947评论 2 9
  • 你一定也做过千奇百怪的梦,它杂乱无章可偏偏又让人印象深刻甚至感觉真实。 古代人往往认为梦是某种神喻,现代人则认为梦...
    阿慧阿阅读 2,118评论 2 0
  • “圣地、神秘、心灵天堂”,为着这几个关键词,直飞高原,在拉萨寻了一辆八成新的红色丰田越野,一位黑黝黝的四...
    江南古莲子阅读 1,280评论 0 0