我是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 variables和Python 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()吗?
答案 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