Должен ли я использовать класс, когда имеет смысл иметь только один экземпляр? - PullRequest
0 голосов
/ 04 февраля 2019

Я начинающий программист Python, работающий над настройкой видеосервера Flask на основе этого руководства .Часть кода, с которой у меня проблема, используется для инициализации веб-камеры компьютера и вывода кадров:

class Camera(object):
    thread = None  # background thread that reads frames from camera
    frame = None  # current frame is stored here by background thread
    last_access = 0  # time of last client access to the camera
    start_time = 0  # time at which the camera is started

    def __init__(self):
        """Start the background camera thread if it isn't running yet."""
        ...

    def get_frame(self):
        """Return the current camera frame."""
        ...

    @staticmethod
    def frames():
        """"Generator that returns frames from the camera."""
        ...

    @classmethod
    def _thread(cls):
        """Camera background thread."""
        ...

Для меня не имеет смысла использовать класс для этого, поскольку должен быть только одинэкземпляр объекта Camera.Из-за этого каждый раз, когда к серверу делается запрос, создается новый объект без причины.

Я рассмотрел возможные способы его рефакторинга.Что я нашел до сих пор:

  • Используйте одноэлементный класс, но это не кажется рекомендуемым в Python
  • Поместите все в отдельный модуль.Тогда все переменные класса станут глобальными переменными, и это плохо из того, что я прочитал

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Очень хорошая причина для создания класса - иметь все методы (которые будут работать как атрибуты для вашего объекта) в одном месте.Это дает полный контроль над динамикой того, что может происходить с объектом, особенно когда ваша программа увеличивается в размере.Убедительным примером может быть, например, включение, скажем, входа в ваш код и использование декоратора @get_log (для метода-оболочки get_log() внутри вашего класса) над всеми функциями вне класса.Эта регистрация предоставит необходимую информацию отладки.

Модуляризация кода с использованием классов компенсирует небольшие накладные расходы с использованием памяти для одного объекта, особенно когда ключевыми являются долгосрочное обслуживание кода, его качество и контроль.

0 голосов
/ 04 февраля 2019

Нет ничего плохого в создании класса, для которого вы ожидаете иметь один экземпляр.Классы - это фантастический способ организовать и разделить ваш код.Для этого вы можете использовать модуль, но если вы моделируете реальный объект (а «Камера», безусловно, кажется объектом), классы являются подходящим инструментом для работы.

Кроме того, использованиекласс значительно облегчает тестирование вашего кода, поскольку вы можете импортировать класс в тестовом примере и взаимодействовать с ним вне самой программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...