Python выполняет функцию класса без создания экземпляра

#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. Оба из них, похоже, выполняют то, что мне нужно с точки зрения доступа к данным и их изменения. Спасибо! Какой из этих двух подходов упростил бы реализацию шаблона наблюдателя?