내 조언은 각각 특정 유형의 메시지를 처리 할 수있는 모듈 형 MessageHandler
클래스를 사용하는 코드를 구조 조정하는 것 (즉 single responsibility가) 로봇의 전반적인 동작은 다음의 종류와 순서에 따라 결정되면서, chain of responsibility 내에서 메시지 핸들러 : 여러 가지 다른 장점 중

이 이 구현 벨로에서 (쉽게 명령을 호출 사이에 재사용 대기 시간을 구현할 수 있습니다 w, 다른 유형의 메시지에 대해 다른 지속 시간의 재사용 대기 시간을 사용자 정의 할 수 있음).
from abc import ABC, abstractmethod
from datetime import datetime, timedelta
from time import sleep
class MessageHandler(ABC):
def __init__(self, command_cooldown):
self._command_cooldown = command_cooldown
self._last_command_usage = datetime.min
def try_handle_message(self, message):
if self._can_handle_message(message) and not self.__on_cooldown:
self._last_command_usage = datetime.now()
return self._handle_message(message)
else:
return None
@property
def __on_cooldown(self):
return datetime.now() - self._last_command_usage <= self._command_cooldown
@abstractmethod
def _can_handle_message(self, s):
pass
@abstractmethod
def _handle_message(self, s):
pass
class TestMessageHandler(MessageHandler):
def __init__(self):
super().__init__(timedelta(seconds=5))
def _can_handle_message(self, s):
return 'test' in s
def _handle_message(self, s):
return 'Testing command'
class Bot(object):
def __init__(self):
self._message_handlers = [TestMessageHandler()]
def receive_message(self, message):
print('Received:', message)
for message_handler in self._message_handlers:
response = message_handler.try_handle_message(message)
if response:
self.send_response(response)
def send_response(self, response):
print('Responding:', response)
if __name__ == '__main__':
bot = Bot()
bot.receive_message('test')
for i in range(6):
bot.receive_message('test')
print('Sleep 1 second...')
sleep(1)
출력
Received: test
Responding: Testing command
Received: test
Sleep 1 second...
Received: test
Sleep 1 second...
Received: test
Sleep 1 second...
Received: test
Sleep 1 second...
Received: test
Sleep 1 second...
Received: test
Responding: Testing command
Sleep 1 second...