您可以为此类工作使用 pub 子系统。我是rxpy 之类的工具的忠实粉丝,但 Pub-Sub 的核心概念很容易添加自己。以此为例:
class DriveTo:
def drive_to(self, location):
print(f"Driving To {location}")
class LoadWashingMachine:
def load_washing_machine(self):
print(f"Loading washing machine")
class DoLaundry:
def __init__(self, laundromat):
self._laundromat = laundromat
self._drive_to_events = []
self._load_washing_machine_events = []
def _drive_to(self, location):
for drive_event in self._drive_to_events:
drive_event.drive_to(location)
def _load_washing_machine(self):
for washing_machine_event in self._load_washing_machine_events:
washing_machine_event.load_washing_machine()
def do_laundry(self):
self._drive_to(self._laundromat)
self._load_washing_machine()
在这里,我们看到每个组件都可以连接,而无需了解其消息的接收者。在您的应用程序的主体中,您将处理将每个对象链接到适当的事件方法。一个例子:
drive_to = DriveTo()
load_washing_machine= LoadWashingMachine()
do_laundry = DoLaundry(laundromat="cleaners")
do_laundry.drive_to_events.append(drive_to)
do_laundry.load_washing_machine_events.append(load_washing_machine)
do_laundry.do_laundry()
更进一步,我们可以看到每个事件的逻辑都是多余的。我们可以通过为事件创建一个通用类来简化这一点。每种类型的消息都可以是不同的 observable 实例,接收者可以指定他们订阅的事件类型。
class Observer(ABC):
@abstractmethod
def on_next(self, *args, **kwargs):
pass
class Observable:
def __init__(self):
self._observers = []
def subscribe(self, observer):
self._observers.append(observer)
def on_next(self, *args, **kwargs) -> None:
for observer in self._observers:
observer.on_next(*args, **kwargs)
重构我们最初的例子:
class DriveTo(Observer):
def on_next(self, location):
print(f"Driving To {location}")
class LoadWashingMachine(Observer):
def on_next(self):
print(f"Loading washing machine")
class DoLaundry:
def __init__(self, laundromat):
self._laundromat = laundromat
self.drive_observable = Observable()
self.load_observable = Observable()
def do_laundry(self):
self.drive_observable.on_next(self._laundromat)
self.load_observable.on_next()
do_laundry = DoLaundry(laundromat="cleaners")
do_laundry.drive_observable.subscribe(DriveTo())
do_laundry.load_observable.subscribe(LoadWashingMachine())
do_laundry.do_laundry()
rxpy 库提供了很多这样的实用程序,使您可以非常轻松地编写代码。它可以处理诸如过滤流、组合它们、处理异常、取消订阅事件等等。