2015-03-19 2 views
3

У меня есть класс A с двумя методами, метод_one, который использует функцию defer и method_two, в функции обратного вызова я устанавливаю значение self.value и добавляю его в цепочку обратного вызова. но после этого значение self.value по-прежнему является исходным значением метода method_two. Короче говоря, присвоение self.value в функции обратного вызова недопустимо.twisted defer сделать присвоение переменных экземпляра класса недействительным

from twisted.internet import utils, reactor 
class A(object): 

    def __init__(self): 
     self.value = [] 

    def method_one(self): 
     d = utils.getProcessOutput('/bin/sh', ('-c', 'ls /home')) # return a defer 
     def set_self_value(result): 
      self.value = result.split() # assign result.split() to self.value 
     d.addCallback(set_self_value) 

    def method_two(self): 
     print self.value # it is still [] rather than result 

a = A() 
a.method_one() 
a.method_two() 
reactor.run() 

output: 
[] # i expect self.value is ['lost+found', 'user'] 
lost+found 
user 

заранее спасибо :-)

+0

'result', кажется, не содержит ничего, когда' set_self_value' называется. – ILostMySpoon

ответ

3

Вопрос заключается в том, что, как method_one откладывается, поэтому, вместо вызова set_self_value сразу это в первую очередь переходит к следующему шагу a.method_two(), следовательно, как в то время значение еще не установлено, вы получаете пустой список.

Чтобы убедиться, что method_two вызывается после method_one добавить его в цепи обратного вызова:

import twisted 
from twisted.internet import utils 
from twisted.internet import reactor 


class A(object): 

    def __init__(self): 
     self.value = [] 

    def method_one(self): 
     d = utils.getProcessOutput('/bin/sh', ('-c', 'ls /home')) 
     def set_self_value(result): 
      print 'called set' 
      self.value = 100 
     d.addCallback(set_self_value) 
     d.addCallback(self.method_two) 

    def method_two(self, *args): # *args required to handle the result 
     print 'called two' 
     print self.value 

def main(): 
    a = A() 
    a.method_one() 


reactor.callWhenRunning(main) 
reactor.run() 

Выход:

called set 
called two 
100 

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

  • Нет связанных вопросов^_^