【发布时间】:2017-01-30 08:39:51
【问题描述】:
在 JavaScript 中我可能会写一个这样的函数:
function counter() {
foo = 0;
function increment() {
foo += 1
console.log(foo);
}
function printVal() {
console.log(foo);
}
return {
increment: increment,
printVal: printVal,
}
}
func = counter();
func.increment()
func.increment()
func.printVal()
我想尝试使用python实现类似的功能。特别是我如何通过外部函数的返回访问两个内部函数。
这是一个可以运行但看起来很有趣的 python 版本:
def counter():
foo = {'bar': 0}
def increment():
foo['bar'] += 1
return foo['bar']
def printVal():
return foo['bar']
return {'increment': increment, 'printVal': printVal}
func = counter()
func['increment']()
func['printVal']()
是否有某种更优雅或“pythonic”的方式来编写这样的闭包?
【问题讨论】:
-
在这种情况下,您可能想要使用
collections.Counter对象,或者只是编写一个类。 -
你首先应该问自己为什么要在 JS 中使用闭包:闭包通常是 classlike 行为的替代品。在 python 的情况下,您确实可以使用
class来模拟相应的行为。你的两个函数变成了真正的方法。