Измените связанные переменные закрытия в Python

Вот еще один способ сделать

/*
one more way of declaring constants in a class,
Note - the constants have to be declared after the class is defined
*/
class Auto{
   //other methods
}
Auto.CONSTANT1 = "const1";
Auto.CONSTANT2 = "const2";

console.log(Auto.CONSTANT1)
console.log(Auto.CONSTANT2);

Примечание - порядок важен, вы не можете иметь константы выше

Использование console.log (Auto.CONSTANT1);

34
задан Vicent Marti 24 December 2008 в 23:38
поделиться

5 ответов

Я не думаю, что существует любой способ сделать это в Python. Когда закрытие определяется, текущее состояние переменных в объеме включения получено и больше не имеет непосредственно referenceable имя (снаружи закрытия). Если бы необходимо было звонить foo() снова, новое закрытие имело бы различный набор переменных от объема включения.

В Вашем простом примере, Вы могли бы быть более обеспеченным использованием класса:

class foo:
        def __init__(self):
                self.var_a = 2
                self.var_b = 3

        def __call__(self, x):
                return self.var_a + self.var_b + x

localClosure = foo()

# Local closure is now "return 2 + 3 + x"
a = localClosure(1) # 2 + 3 + 1 == 6

# DO SOME MAGIC HERE TO TURN "var_a" of the closure into 0
# ...but what magic? Is this even possible?
localClosure.var_a = 0

# Local closure is now "return 0 + 3 + x"
b = localClosure(1) # 0 + 3 +1 == 4

, Если бы Вы используете эту технику, я больше не использовал бы имя localClosure, потому что это больше не на самом деле закрытие. Однако это работает то же один.

20
ответ дан Greg Hewgill 11 October 2019 в 06:39
поделиться

Это довольно возможно в python 3 благодаря волшебству нелокальный .

def foo():
        var_a = 2
        var_b = 3

        def _closure(x, magic = None):
                nonlocal var_a
                if magic is not None:
                        var_a = magic

                return var_a + var_b + x

        return _closure


localClosure = foo()

# Local closure is now "return 2 + 3 + x"
a = localClosure(1) # 2 + 3 + 1 == 6
print(a)

# DO SOME MAGIC HERE TO TURN "var_a" of the closure into 0
localClosure(0, 0)

# Local closure is now "return 0 + 3 + x"
b = localClosure(1) # 0 + 3 +1 == 4
print(b)
26
ответ дан recursive 11 October 2019 в 06:39
поделиться

Почему бы не сделать var_a и var_b аргументы функционального нечто?

def foo(var_a = 2, var_b = 3):
    def _closure(x):
        return var_a + var_b + x
    return _closure

localClosure = foo() # uses default arguments 2, 3
print localClosure(1) # 2 + 3 + 1 = 6

localClosure = foo(0, 3)
print localClosure(1) # 0 + 3 + 1 = 4
0
ответ дан titaniumdecoy 11 October 2019 в 06:39
поделиться

Я нашел альтернативный ответ ответа Greg, немного менее подробному, потому что он использует Python 2.1's пользовательские функциональные атрибуты (к которому достаточно удобно можно получить доступ из их собственной функции).

def foo():
    var_b = 3

    def _closure(x):
        return _closure.var_a + var_b + x

    _closure.func_dict['var_a'] = 2
    return _closure


localClosure = foo()

# Local closure is now "return 2 + 3 + x"
a = localClosure(1) # 2 + 3 + 1 == 6

# DO SOME MAGIC HERE TO TURN "var_a" of the closure into 0
# ...but what magic? Is this even possible?
# apparently, it is
localClosure.var_a = 0

# Local closure is now "return 0 + 3 + x"
b = localClosure(1) # 0 + 3 +1 == 4

Мысль я отправил бы его для полноты. Аплодисменты так или иначе.

10
ответ дан Vicent Marti 11 October 2019 в 06:39
поделиться

Мы сделали следующее. Думаю, здесь это проще, чем другие решения.

class State:
    pass

def foo():
    st = State()
    st.var_a = 2
    st.var_b = 3

    def _closure(x):
        return st.var_a + st.var_b + x
    def _set_a(a):
        st.var_a = a

    return _closure, _set_a


localClosure, localSetA = foo()

# Local closure is now "return 2 + 3 + x"
a = localClosure(1) # 2 + 3 + 1 == 6

# DO SOME MAGIC HERE TO TURN "var_a" of the closure into 0
localSetA(0)

# Local closure is now "return 0 + 3 + x"
b = localClosure(1) # 0 + 3 +1 == 4

print a, b
9
ответ дан 27 November 2019 в 06:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: