Исходный код 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