Python 无法从回调函数更改/编辑类属性/变量

Python 无法从回调函数更改/编辑类属性/变量,python,callback,thread-safety,Python,Callback,Thread Safety,我试图从回调函数更改类的属性,但该属性的值始终等于它初始化为的值,即0 class Rainfall: def __init__(self): self.rainHalfHourCounter = 0 def incrementRain(self,channel): self.rainHalfHourCounter = self.rainHalfHourCounter + 1 print "incrementRain ",self

我试图从回调函数更改类的属性,但该属性的值始终等于它初始化为的值,即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函数中的值会更改,但class属性不会更改,因此我无法在incrementRain函数之外使用self.rainHalfHourCounter。while循环中的打印行始终打印0。它从不增加。这是线程安全问题吗?这个问题有没有简单的解决办法


任何帮助/简短的示例代码都将不胜感激。

以下是您的raining.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

如何使用incrementRain函数和self.rainHalfHourCounter属性?你能粘贴相关代码吗?我已经更新了代码,我在多个地方使用了self.rainHalfHourCounter,但只是为了说明一下,self.rainHalfHourCounter的值在while循环中不会改变。这是我的大问题。请提供一个简短、完整的程序来演示错误。更多信息,请参见或。@FrancoisWattel,我认为问题不在于你的课程。似乎没有正确调用incrementRain函数。我怀疑您的GPIO对象/模块没有调用incrementRain。您需要向我们提供您的执行结果,以便我们能够帮助您。感谢您的响应,我找到了一个解决方案。我使用了后台interval ApScheduler来存储incrementRain计数器,看起来我没有在代码中的正确位置启动Scheduler。因此,我无法看到计数器递增。很难解释,但你是对的,我的问题不在课堂上。我在运行我上传的示例代码后发现了这个错误,并且看到它确实在工作。很抱歉没有测试它,但我很确定它是不正确的。感谢您的回复,我找到了一个解决方案。你是对的,示例代码实际上是正确的,这帮助我在其他地方搜索错误。我没有测试我的示例代码,因为我非常确定它是错误的。对不起,我是个笨蛋。。。