Python计时器线程作为类变量从不同的类实例调用timer.start()和timer.cancel()

时间:2018-11-06 19:05:18

标签: python inheritance polymorphism class-variables

我是python的新手,也是线程的新手。我正在尝试为客户端Web服务器界面编写客户端,并且正在使用State设计模式。我被困在类中使用计时器对象作为类变量。我正在使用threading.Timer类实现该对象,但是在将set_time方法作为参数传递给构造函数时遇到麻烦。如果使用threading.Timer(5.0,self.set_time),则会收到“ NameError:未定义名称'self'”错误。如果我使用threading.Timer(5.0,set_time),则会收到“ NameError:未定义名称'set_time'”的错误。下面是我的代码:

import time
import threading
import sys

from packet import Packet
from check import ip_checksum


class State():

    timer = threading.Timer(5.0, self.set_time)
    timeout = False

    def __init__(self):        
    time = False

    def time_out(self):
        return time

    def set_time(self):
        global timeout 
        timeout = True

    def start_timer(self):
        timer.start()

    def stop_timer(self):
        global timeout         
        timer.cancel()
        timeout = False

    def send_packet(self, data):
        print("Parent state send: " + data)
        self.start_timer()
        return True

    def receive_packet(self, packet):
        print("Parent state receive packet")
        self.stop_timer()
        return True

我用Google搜索了Python class instance vs. class variablesPython threading.timer - repeat function every 'n' seconds。这些都有所帮助,但我仍然有两个问题。一个是一般而言,另一个更具体地针对我的问题。

一个:我应该如何实例化一个使用构造函数的类变量,该构造函数引用该类中的方法。

二:如何使用线程作为类变量,以供从State类继承的类使用?例如,说我有一个从State继承的类Wait_For_Call。我实例化一个对象wait_for_call = Wait_For_Call()。我可以做wait_for_call.start_timer()还是wait_for_call.stop_timer()吗?

1 个答案:

答案 0 :(得分:1)

一个: this question中对此进行了讨论。 您可以使用模块变量(请参见下文)。

两个: 使用@classmethod装饰器声明一个类方法。该方法的第一个参数(通常称为“ cls”)使您可以访问类变量。

由于在第一个问题的答案中,我建议使用模块变量(如我所参考问题的答案中所述),因此不需要类方法或类变量来访问它。如果您将timeout保留为类变量,则可能仍需要它们。

在这里,您可以了解如何从类方法中访问类变量:

class Base :
    my_number = 1

    @classmethod
    def class_method(cls):
        print (cls.my_number)
        cls.my_number = cls.my_number + 3