Поток Python-таймера как вызов переменной класса timer.start () и timer.cancel () из разных экземпляров класса - PullRequest
0 голосов
/ 06 ноября 2018

Я немного новичок в Python и очень плохо знаком с потоками. Я пытаюсь написать клиент для интерфейса клиент-веб-сервер и использую шаблон проектирования 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

Я погуглил и посмотрел на Экземпляр класса Python против переменных класса и Python threading.timer - повторять функцию каждые 'n' секунд . Это помогло, но все же у меня есть два вопроса. Один в общем, другой более специфичный для моей проблемы.

Первый: как создать экземпляр переменной класса, использующей конструктор, который ссылается на метод в классе.

Два: как я могу использовать поток в качестве переменной класса для классов, которые наследуются от моего класса State? Например, скажем, у меня есть класс Wait_For_Call, который наследует от State. Я создаю экземпляр объекта wait_for_call = Wait_For_Call (). Могу ли я просто сделать wait_for_call.start_timer () или wait_for_call.stop_timer ()?

1 Ответ

0 голосов
/ 07 ноября 2018

One: Это обсуждается в этом вопросе . Вы можете использовать переменную модуля (см. Ниже).

Два: Используйте декоратор @classmethod для объявления метода класса. Первый параметр метода (обычно называемый 'cls') предоставляет вам доступ к переменным класса.

Поскольку в ответе на ваш первый вопрос я предложил использовать переменную модуля (как описано в ответах на вопрос, на который я ссылался), вам не нужен метод класса или переменные класса для доступа к нему. Вам все еще могут понадобиться они для доступа к timeout, если вы храните его как переменную класса.

Здесь вы можете увидеть, как получить доступ к переменной класса из метода класса:

class Base :
    my_number = 1

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