2015-10-14 6 views
1

Допустим, у меня есть функция с переменной продолжительностью внутри нее.Можно ли установить переменную экземпляра для функции в python?

Есть ли способ установить значение Duration` вне функции в какой-либо другой функции без функции, не регулируя какой-либо параметр?

+0

Из-за пределов 'slowAction' или' make_slow'? – cdonts

+0

Да, извините, если я не понял. Я хочу отрегулировать значение в функции, полностью отделенной от этой, где я вызываю эту функцию. – swagbag

+0

Боюсь, это невозможно. Почему вы не можете использовать параметр? – cdonts

ответ

2

С Python 3.x вы можете объявить с ключевым словом nonlocal

def make_slow(action): 
    slowDuration = None 

    def slowAction(self, colony): 
     nonlocal slowDuration 
     slowDuration = 10 # It is changing the variable from the scope above 

Если вы хотите изменить значение где-то еще, и вы не должны возвращать значение, попробуйте global ... Примечание это может загрязнить ваше текущее пространство имен.

Для более питонического подхода вы должны использовать что-то вроде self.slowDuration. Для этого нужны объекты.

1

slowDuration - локальная переменная функции slowAction. Точка локальных переменных состоит в том, что они доступны только внутри функции.

Вы должны изменить функцию slowAction, поэтому она использует переменную slowDuration, которая определена где-то в другом месте, например, в качестве переменной-члена класса, которой, по-видимому, принадлежит make_slow.

Вы также можете сделать slowAction экземпляром класса, который переопределяет метод __call__.

>>> class Counter: 
...  def __init__(self): 
...   self.count = 0 
...  def __call__(self, delta): 
...   self.count += delta 
...   print(self.count) 
...  def set_count(self, c): 
...   self.count = c 
... 
>>> c = Counter() 
>>> c(1) 
1 
>>> c(3) 
4 
>>> c(3) 
7 
>>> c(3) 
10 
>>> c.set_count(42) 
>>> c(-2) 
40 

Вы можете также использовать некоторые хитрости, чтобы сделать общей переменной доступны на самой функции объекта:

def makeCounter(): 
    counter = None 
    def counter_func(): 
     counter.count += 1 
     print(counter.count) 
    counter = counter_func 
    counter.count = 0 
    return counter 

и использовать его как это:

>>> c = makeCounter() 
>>> c() 
1 
>>> c() 
2 
>>> c() 
3 
>>> c() 
4 
>>> c.count = 42 
>>> c() 
43 
>>> c() 
44 
>>> c() 
45 

Но в целом " умного "кода следует избегать, если у вас нет веских оснований для его использования, потому что это затрудняет понимание базы кода.

Смежные вопросы