В 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()
Я хочу, чтобы попытаться достичь аналогичной функции с помощью питона. В частности, как я могу получить доступ к обеим внутренним функциям через возврат внешней функции.
Здесь работает, но смешно смотреть, версия в питоне:
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']()
Есть ли какая-то более элегантного или «вещий» способ написания закрытия, как это?
В этом случае вы, вероятно, захотите использовать объект 'collections.Counter' или просто написать класс. – monkut
Вы должны спросить себя, почему вы используете закрытие в JS в первую очередь: закрытие часто заменяет поведение _classlike_. В случае python вы можете использовать действительно класс, чтобы моделировать поведение пользователя. И ваши две функции становятся _real_ методами. –