#python #observer-pattern
#python #наблюдатель-шаблон
Вопрос:
Я создаю программное обеспечение и использую один класс только для хранения данных:
class Data():
data = [1,2,3]
Теперь к данным в этом классе можно получить доступ и изменять их из других классов без создания экземпляра класса данных, что именно то, что мне нужно.
Чтобы правильно обновлять программное обеспечение, я должен вызывать функции в других классах при каждом изменении данных. Я посмотрел на шаблон наблюдателя в python, но не смог заставить его работать, не делая data атрибутом класса, который доступен только при создании экземпляра. Другими словами, все реализации шаблона наблюдателя, которые я нашел, требуются:
class Data():
def __init__(self):
self.data = [1,2,3]
Очевидно, что если данные являются моим издателем / наблюдаемым, их необходимо создать один раз, чтобы получить функциональность (насколько я понимаю), но я ищу реализацию, подобную:
class Data():
data = [1,2,3]
def __init__(self):
self.subscribers = {}
def register(self, who, callback):
self.subscribers[who] = callback
def dispatch(self):
for susbriber, callback in self.subscribers.items():
callback()
Для примера давайте использовать этот другой класс в качестве подписчика / наблюдателя, который также может изменять данные с помощью другой функции. Поскольку это будет основной класс, обрабатывающий программное обеспечение, именно здесь я создаю экземпляр данных, чтобы получить поведение наблюдателя. Однако важно, чтобы мне не пришлось создавать его экземпляр только для получения данных, поскольку данные будут изменены из множества других классов:
class B():
def __init__(self):
self.data = Data()
self.data.register(self, self.print_something)
def print_something(self):
print("Notification Received")
def change_data(self):
Data.data.append(100)
Теперь мой вопрос заключается в том, как автоматически отправлять уведомление от издателя / наблюдаемого всякий раз, когда данные каким-либо образом изменяются?
Я использую python 3.8 в Windows 10.
Комментарии:
1. Не используйте класс, если вы не собираетесь создавать его экземпляр. Используйте отдельный модуль, если вы хотите инкапсулировать функции, или создайте частный класс и создайте один его экземпляр как глобальный модуль.
2. Шаблон Borg Алекса Мартелли предоставляет способ создания нескольких экземпляров с общим состоянием. Это может быть проще в управлении.
3. Оба из них, похоже, выполняют то, что мне нужно с точки зрения доступа к данным и их изменения. Спасибо! Какой из этих двух подходов упростил бы реализацию шаблона наблюдателя?