闭包(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、闭包的核心特性就是它可以记住定义闭包时的环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值