Исходный код EJIO.utils.component.clock.base_clock
## /utils/component/clock/base_clock.py
from .err import ClockError
from .time_class import Time
from abc import ABC, abstractmethod
from threading import Lock
from typing import Self
__all__ = [
'Clock',
]
[документация]
class Clock(ABC):
"""
Базовый класс часов: обеспечивает старт и остановку времени.
"""
__slots__ = ('_running', '_lock')
def __init__(self) -> None:
"""
Инициализация базового класса часов.
"""
self._running: bool = False
self._lock: Lock = Lock()
[документация]
def start(self) -> Self:
"""
Запускает часы.
:return: Сам объект для цепочки вызовов.
:raises ClockError: Если часы уже запущены.
"""
with self._lock:
if self._running:
raise ClockError("Clock already started")
self._running = True
return self
[документация]
def stop(self) -> Self:
"""
Останавливает часы.
:return: Сам объект для цепочки вызовов.
:raises ClockError: Если часы не запущены.
"""
with self._lock:
if not self._running:
raise ClockError("Clock is not started")
self._running = False
return self
[документация]
@abstractmethod
def get_time(self) -> Time:
"""
Возвращает текущее время.
:return: Объект Time.
:raises NotImplementedError: Должен быть реализован в подклассах.
"""
raise NotImplementedError
@property
def running(self) -> bool:
"""
Возвращает статус часов.
:return: Запущены ли часы.
"""
with self._lock:
return self._running