В 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
Ще один підхід для реалізації подій в 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.