【问题标题】:Python timer thread as class variable call timer.start() and timer.cancel() from different class instancesPython 计时器线程作为类变量从不同的类实例调用 timer.start() 和 timer.cancel()
【发布时间】:2019-04-10 05:29:31
【问题描述】:

我对 python 有点陌生,对线程也很陌生。我正在尝试为客户端-网络服务器接口编写客户端,并且我正在使用状态设计模式。我坚持在我的类中使用计时器对象作为类变量。我正在使用 threading.Timer 类实现该对象,但是在将 set_time 方法作为参数传递给构造函数时遇到了麻烦。如果我使用 threading.Timer(5.0, self.set_time) 我得到一个 "NameError: name 'self' is not defined" 错误。如果我使用 threading.Timer(5.0, set_time) 我得到一个“NameError: name 'set_time' is not defined”错误。以下是我的代码:

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() 吗?

【问题讨论】:

  • 您希望他们对所有实例都使用一个计时器?
  • 澄清一下,当您说“引用类中的方法”时,您是指静态方法还是非静态方法(引用实例变量的方法在实例化时使用会有点问题一个类变量:-))
  • 是的,为所有实例使用一个计时器。这将是一个静态方法。

标签: python inheritance polymorphism class-variables


【解决方案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

【讨论】:

  • 这为我回答了问题 1。但我仍然不确定如何使用一个线程来上课。
  • 链接问题中的建议是使其成为模块变量。然后将只有一个实例。我认为有办法让它成为类变量,但如果有的话我还没有找到。
  • 这是有道理的。类方法解决了我更直接的问题。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2017-04-28
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
相关资源
最近更新 更多