网站大量收购独家精品文档,联系QQ:2885784924

7.12 访问闭包中定义的变量.pdf

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
7.12 访问闭包中定义的变量

7.12 访问闭包中定义的变量 问题 你想要扩展函数中的某个闭包,允许它能访问和修改函数的内部变量。 解决⽅案 通常来 ,闭包的内部变量对于外界来 是完全隐藏的。但是,你可以通过编写访问 函数并将其作为函数属性绑定到闭包上来实现这个⽬的。例如: def sample(): n = 0 # Closure function def func(): print(n=, n) # Accessor methods for n def get_n(): return n def set_n(value): nonlocal n n = value # Attach as function attributes func get_n = get_n func set_n = set_n return func 下⾯是使⽤的例⼦: f = sample() f() n= 0 f set_n(10) f() n= 10 f get_n() 10 讨论 为了说明清楚它如何⼯作的,有两点需要解释⼀下。⾸先,nonlocal 声明可以让我 们编写函数来修改内部变量的值。其次,函数属性允许我们⽤⼀种很简单的⽅式将访 问⽅法绑定到闭包函数上,这个跟实例⽅法很像(尽管并没有定义任何类) 。 还可以进⼀步的扩展,让闭包模拟类的实例。你要做的仅仅是复制上⾯的内部函数到 ⼀个字典实例中并返回它即可。例如: import sys class ClosureInstance: def __init__(self, locals=None): if locals is None: locals = sys _getframe(1) f_locals # Update instance dictionary with callables self __dict__ update((key,value) for key, value in locals if callable(value) ) # Redirect special methods def __len__(self): return self __dict__[__len__]() # Example use def Stack(): items = [] def push(item): items append(item) def pop(): return items pop() def __len__(): return len(items) return ClosureInstance() 下⾯是⼀个交互式会话来演⽰它是如何⼯作的: s = Stack() s __main__ ClosureInstance object at 0x10069ed10 s push(10) s push(20) s push(Hello) len(s) 3 s pop() Hello s pop() 20 s pop() 10 有趣的是,这个代码运⾏起来会⽐⼀个普通的类定义要快很多。你可能会像下⾯这样 测试它跟⼀个类的性能对⽐: class Stack2: def __init__(self): self items = [] def push(self, item): self items append(item) def pop(self): return self items pop() def __len__(self): return len(self items) 如果这样做,你会得到类似如下的结果: from timeit import timeit # Test involving closures s = Stack() timeit(s push(1);s pop(), from __main__ import s) 0 987475426

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档