Я хотел бы предоставить пользователям одного из моих модулей возможность расширять его возможности, предоставляя интерфейс для вызова пользовательских функций.Например, я хочу дать пользователям возможность получать уведомления при создании экземпляра класса, а также возможность изменять экземпляр перед его использованием.
Способ, который я реализовал, заключается в объявлениифункция фабрики уровня модуля, которая выполняет создание:
# in mymodule.py
def factory(cls, *args, **kwargs):
return cls(*args, **kwargs)
Затем, когда мне нужен экземпляр класса в mymodule, я делаю factory(cls, arg1, arg2)
вместо cls(arg1, arg2)
.
Toрасширить его, программист мог бы написать в другом модуле функцию, подобную этой:
def myFactory(cls, *args, **kwargs):
instance = myFactory.chain(cls, *args, **kwargs)
# do something with the instance here if desired
return instance
Установка вышеуказанного обратного вызова выглядит следующим образом:
myFactory.chain, mymodule.factory = mymodule.factory, myFactory
Это кажется мне достаточно простым, ноМне было интересно, если бы вы, как программист на Python, ожидали, что функция зарегистрирует обратный вызов, вместо того, чтобы делать это с присваиванием, или есть другие методы, которые вы ожидаете.Мое решение кажется вам работоспособным, идиоматичным и понятным?
Я стараюсь сделать его максимально простым;Я не думаю, что большинству приложений на самом деле нужно будет связывать более одного пользовательского обратного вызова, например (хотя неограниченная цепочка идет «бесплатно» с вышеописанным шаблоном).Я сомневаюсь, что им нужно будет удалить обратные вызовы или указать приоритеты или порядок.Модули, такие как python-callbacks или PyDispatcher , кажутся мне излишними, особенно последние, но если у программиста, работающего с моим модулем, есть убедительные преимущества, я открыт для них.