分配一个类变量,然后在不使用Python中的global的情况下重新分配定义

时间:2016-09-21 21:33:04

标签: python python-3.x

所以我的问题在标题中,以下两段代码是我尝试的。我试图在脚本启动后立即分配变量,然后在特定时间间隔运行循环定义并更新同一变量。我不想使用全局。

from twisted.internet import task, reactor

class DudeWheresMyCar(object):
    counter = 20
    stringInit = 'initialized string'

    def loop():
        stringNew = 'this will be updated with a changing string'
        if (stringInit == stringNew):      #Error line
            print(stringNew)
        elif (stringInit != stringNew ):
            stringInit = stringNew
        pass

    task.LoopingCall(loop).start(counter)
    reactor.run()

这会导致未定义的stringInit错误。我知道为什么我收到此错误所以我尝试使用.self变量修复此问题,代码如下。

from twisted.internet import task, reactor

class DudeWheresMyCar(object):
    counter = 20

    def __init__(self):
        self.stringInit = 'Initialized string'

    def loop(self):
        stringNew = 'this will be updated with a changing string'
        if (self.stringInit == stringNew):
            print(stringNew)
        elif (self.stringInit != stringNew ):
            self.stringInit = stringNew
        pass

    task.LoopingCall(self.loop).start(counter)    #Error line
    reactor.run()

我收到一个错误,指出self未定义。我理解是什么导致两种情况都抛出错误,但我不知道如何改变我的方法来实现我的目标。我也遇到了使用单例,但仍未解决方案2中的问题。

1 个答案:

答案 0 :(得分:1)

我认为你想要一个classmethod,你需要在类定义之外启动任务。我希望像下面的代码一样工作

from twisted.internet import task, reactor

class DudeWheresMyCar(object):
    counter = 20

    stringInit = 'Initialized string'

    @classmethod
    def loop(cls):
        stringNew = 'this will be updated with a changing string'
        if (cls.stringInit == stringNew):
            print(stringNew)
        elif (cls.stringInit != stringNew ):
            cls.stringInit = stringNew


task.LoopingCall(DudeWheresMyCar.loop).start(DudeWheresMyCar.counter)
reactor.run()