2014-09-22 3 views
0

Я пытаюсь изменить атрибут класса из функции обратного вызова, но значение атрибута всегда равно значению, которое оно было инициализировано как, например, 0. 0.Невозможно изменить/отредактировать атрибут/переменную класса из функции обратного вызова

class Rainfall: 
    def __init__(self): 
     self.rainHalfHourCounter = 0 

    def incrementRain(self,channel): 
     self.rainHalfHourCounter = self.rainHalfHourCounter + 1 
     print "incrementRain ",self.rainHalfHourCounter 

    rainfall = Rainfall() 
    GPIO.add_event_detect(11, GPIO.BOTH, callback = rainfall.incrementRain,bouncetime = 200) 

    while True: 
     print self.rainHalfHourCounter 

Функция incrementRain является функцией обратного вызова. Эта функция установлена ​​на прерывание на одном из моих контактов RPi gpio (но в основном это просто функция обратного вызова). Значение изменяется в функции incrementRain, но атрибут класса не изменится, и поэтому я не могу использовать self.rainHalfHourCounter вне функции incrementRain. Линия печати в цикле while всегда печатает 0. Он никогда не увеличивается. Является ли эта проблема безопасной потоком? Может быть, простое решение этой проблемы?

Любая помощь/короткий образец кода будет принята с благодарностью.

+0

Как вы используете функцию incrementRain и атрибутов self.rainHalfHourCounter? Можете ли вы вставить связанный код? – user3885927

+0

Я обновил код, я использую self.rainHalfHourCounter в нескольких местах, но для иллюстрации, значение self.rainHalfHourCounter не изменяется в цикле while. Это моя большая проблема. –

+0

Просьба указать короткую ** ** программу **, которая демонстрирует ошибку. См. Http://SSCCE.org или http://stackoverflow.com/help/mcve для получения дополнительной информации. –

ответ

0

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

class Rainfall: 
    def __init__(self): 
     self.rainHalfHourCounter = 1 

    def incrementRain(self,channel): 
     self.rainHalfHourCounter = self.rainHalfHourCounter + 1 
     print "incrementRain ",self.rainHalfHourCounter 


class TestCallback(object): 
    def __init__(self): 
     self.callbacks = [] 
    def addCallback(self, callback): 
     self.callbacks.append(callback) 
    def run(self, *args): 
     for func in self.callbacks: 
      #invoke all callbacks with passed in arguments 
      func(*args) 

t = TestCallback() 
#First call, should output 1 
r=Rainfall() 
r.incrementRain(None) 
t.addCallback(r.incrementRain) 

#Callback, should output 2 
t.run(None) 

выход:

incrementRain 2 
incrementRain 3 
+0

Спасибо за ответ, я нашел решение. Вы были правы, пример кода действительно правильный, и это помогло мне найти ошибку, где бы вы ни находились. Я не тестировал свой образец кода, так как был совершенно уверен, что он был неисправен. Извините за нобе ... –

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