Pre-loader

/ K2 Cloud ERP for Python / Програмістам / Різні задачі Python-програмістів / Об’єктно-орієнтоване програмування (ООП) / Події в Python та розширення функціоналу сторонніми програмістами

Події в Python та розширення функціоналу сторонніми програмістами

Події за допомогою модуля events

В Python події зазвичай реалізовані за допомогою вбудованого модуля events. Давайте розглянемо приклад створення класу з подіями та їх використання:

from events import Events

class System:
    def __init__(self):
        self.events = Events()
        self.data = {"system_data": "Some data from the system"}

    def run_functionality(self):
        print("Викликається основна функціональність")
        self.events.trigger(’main_functionality’, self.data)

# Код, який може написати сторонній програміст

def on_startup(data):
    print("Викликається під час запуску")
    data["startup_message"] = "Система успішно запущена"

def on_shutdown(data):
    print("Викликається перед завершенням роботи")
    print("Дані системи:", data)

# Використання системи та додання функціоналу через події

system_instance = System()

# Сторонні програмісти підписуються на події
system_instance.events.on(’main_functionality’, on_startup)
system_instance.events.on(’main_functionality’, on_shutdown)

# Основний код системи викликає події
system_instance.run_functionality()

У цьому прикладі використовується модуль events, який дозволяє легко реалізовувати події в класах. Сторонні програмісти підписуються на події за допомогою методу on, передаючи ім'я події та функцію-підписника.

Клас System містить метод run_functionality, який викликає подію 'main_functionality' та передає дані. Усі підписники на цю подію відразу отримають та оброблять ці дані.

Будь ласка, переконайтеся, що у вас встановлено бібліотеку events. Ви можете встановити її за допомогою команди:

pip install events

Події за допомогою класу Observer

Ще один підхід для реалізації подій в Python - це використання стандартного модуля Observer з бібліотеки abc (Abstract Base Classes). Ось приклад:

from abc import ABC, abstractmethod
from typing import List

# Абстрактний клас спостерігача (Observer)
class Observer(ABC):
    @abstractmethod
    def update(self, data):
        pass

# Клас події
class Event:
    def __init__(self):
        self._observers: List[Observer] = []

    def add_observer(self, observer: Observer):
        self._observers.append(observer)

    def remove_observer(self, observer: Observer):
        self._observers.remove(observer)

    def notify_observers(self, data):
        for observer in self._observers:
            observer.update(data)

# Клас системи
class System:
    def __init__(self):
        self.main_functionality_event = Event()
        self.data = {"system_data": "Some data from the system"}

    def run_functionality(self):
        print("Викликається основна функціональність")
        self.main_functionality_event.notify_observers(self.data)

# Код, який може написати сторонній програміст

class StartupObserver(Observer):
    def update(self, data):
        print("Викликається під час запуску")
        data["startup_message"] = "Система успішно запущена"

class ShutdownObserver(Observer):
    def update(self, data):
        print("Викликається перед завершенням роботи")
        print("Дані системи:", data)

# Використання системи та додання функціоналу через події

system_instance = System()

# Сторонні програмісти підписуються на події
system_instance.main_functionality_event.add_observer(StartupObserver())
system_instance.main_functionality_event.add_observer(ShutdownObserver())

# Основний код системи викликає події
system_instance.run_functionality()

У цьому прикладі, Observer - це абстрактний клас, який оголошує метод update, який буде викликатися при оновленні. Клас Event представляє собою конкретну реалізацію події, яка може мати спостерігачі (підписники). Клас System містить екземпляр Event, який представляє подію, і під час виклику методу run_functionality він повідомляє всіх своїх підписників про оновлення.

Автор: Рудюк С.А. 2023. K2 Cloud ERP.