Dependency Injection в сервисах бота


04.01.2020 — Про Python


И тут я понял, что не шарю вообще за ООП, особенно в питоне. Или спать уже хочу. Кооороооочеее

Хочу замутить несколько синглтон классов (3). Возьмем изи пример:

class Singleton:
    __singleton = None

    @classmethod
    def get_instance(cls):
        if cls.__singleton is not None:
            return cls.__singleton
        else:
            raise RuntimeError(f'{cls.__name__} not initialized')

Вооопрооос, если я хочу несколько синглтон классов и не хочу дублировать get_instance в каждом из нём, то как обобщить?

Если вынести выше и унаследоваться, то каждый класс будет юзать один экземляр родителя и будет полная белеберда. У всех будет доступ к инстансу обобщённого класса-родителя, а не текущего класса

UPD. Офигенно объяснил. Короче поле __singleton будет иметь общее значение у всех классов, что унаследовались от Singleton

UPD2. Ну точнее как, get_instance будет возвращать общее поле родителя, а не текущего класса. А как сделать так, чтоб с текущего класса( не хооочууу в каждом классе get_instance иметь(

Что-то я уснул по щелку пальцев без задней мысли об этом, утром начали приходить нотификейты, разбудившие меня. Увлекательно предисловие.

Это мне писали "нафига тебе аж 3 синглтона?".

Мне что-то в голову ударило, что создать класс и там в полях инициализировать свои сервисы (которые я хотел переделать на синглтон) и потом шарить один экземляр этого класса с сервисами на всё приложение не оч хорошо.

class Services:
    def __init__(track_watcher=TrackWatcher()):
        self.track_watcher = track_watcher

services = Services()

А потом где надо

from services import services
services.track_watcher.subscribe(update, context, track)

Когда мне сказали, что это Dependency injection - я ушёл гуглить. То, что нагуглил, вроде подходит под моё. Можно не переписывать ✨

Надо доразобраться с DI

UPD. Собсна видос покрывает чуть ли не всё, что надо знать.

Dependency Injection - Jakob Jenkov

Пока без понятия как более правильно такое делать в питоне и делают ли. Вон кто-то аж либу юзает: Inject - PyPi, которая в своём описании "тонко" намекает the python way, the good way

Недавние посты


© marshal.by 2020

Исходный код

Сайт работает на Gatsby + prismic и опубликован на GitHub.