Вы можете сделать это, и это будет работать примерно так же:
class counter(object):
def __init__(self, count=0):
self.count = count
def __call__(self):
self.count += 1
return self.count
Или немного взломать:
def counter():
count = [0]
def incr(n):
n[0] += 1
return n[0]
return lambda: incr(count)
Я бы пошел с первым решением.
РЕДАКТИРОВАТЬ: Это то, что я получаю за то, что я не читаю большой текстовый блог.
В любом случае, причина закрытия Python довольно ограничена: «потому что Гвидо чувствовал, что это так». Python был разработан в начале 90-х, во времена расцвета OO. Закрытия были довольно низкими в списке языковых особенностей, которые люди хотели. По мере того, как функциональные идеи, такие как функции первого класса, замыкания и другие вещи, становятся популярными, такие языки, как Python, вынуждены были их использовать, поэтому их использование может быть немного неловким, потому что это не то, для чего язык был разработан. *
<rant on="Python scoping">
Кроме того, Python (2.x) имеет довольно странные (на мой взгляд) представления о области видимости, которые, помимо прочего, мешают разумной реализации замыканий. Меня всегда беспокоит то, что это:
new = [x for x in old]
Оставляет нам имя x
, определенное в области, в которой мы его использовали, так как это (на мой взгляд) концептуально меньшая область. (Хотя Python получает баллы за согласованность, поскольку то же самое с циклом for
ведет себя так же. Единственный способ избежать этого - использовать map
.)
В любом случае, </rant>