Я думаю, что здесь есть компромисс между простотой и слабой связью.На мой взгляд, простота заключается в передаче обратного вызова объекту, в то время как слабая связь будет использовать каркас для передачи сигналов между объектами.
Например, если вы используете blinker signalingВ библиотеке вы можете использовать этот альтернативный дизайн:
from blinker import signal
class One:
def __init__(self):
self.two = Two()
self.two.some_signal.connect(self.callback)
def callback(self, data):
print 'Called'
class Two:
some_signal = signal('some_signal')
def process(self):
# Do something
self.some_signal.send()
one = One()
one.two.process()
В приведенном выше коде объект Two
даже не знает, существует ли какой-либо другой объект, заинтересованный в его внутренних изменениях состояния.Тем не менее, он уведомляет о них, испуская сигнал, который может использоваться другими объектами (в данном случае One
объектом) для выполнения какого-то определенного действия.
Хорошим примером такого подхода является инфраструктура GUI.,Когда создается виджет кнопки, нет необходимости передавать обратный вызов, который должен быть выполнен при нажатии кнопки.Однако кнопка генерирует сигнал, по которому нажали, и любой обратный вызов, подписанный на этот сигнал, выполняется для выполнения желаемого действия.