我有两门课:会计和操作员。帐户包含运算符列表。现在,每当操作员(在列表中)收到消息时,我都希望通知Account对象也执行一些业务逻辑。在
关于如何实现这一目标,我想到了三个备选方案:
1)在运算符内保存对容器[Account]对象的引用并直接调用方法。不是绝对好,因为循环引用。在
2)使用事件。据我所知,Python中没有内置的事件处理机制。所以,这个有点难实现。在
3)不要直接向操作员发送消息。相反,只操作帐户,并且在帐户内部操作处理程序运算符。这个有点限制,因为在这种情况下,我不能传递对运算符的引用。在
我想知道从架构的角度来看,哪种方法是最有利的。你通常如何处理这个任务?在
如果您能指出Python中的代码片段,那就太好了。在
我会使用事件处理。您不必自己实现它——我使用pydispatcher来处理这种事件,而且它总是很好地工作(它在内部使用弱引用,以避免循环引用问题)。在
另外,如果您使用的是gui框架,那么您可能已经有了一个可以挂接的事件框架,例如PyQt有信号和插槽。在
观察者模式没有“一刀切”的解决方案。但是通常,最好定义一个EventManager对象,在这个对象中,相关方可以注册自己的某些事件,并在事件发生时发布这些事件。它只会减少依赖性。在
请注意,您需要使用全局事件管理器实例,这在测试期间或从一般OO的角度(它是一个全局变量)可能会有问题。我强烈建议不要一直传递EventManager,因为那样会使代码混乱。在
在我自己的代码中,注册事件的“键”是事件的类。EventManager使用字典(event class->;观察者列表)来知道哪个事件会发生在哪里。在通知代码中,您可以使用
dict.get(event.__class__, ())
来查找侦听器。在你想得太多了。说真的。Python不是C++,Python中的问题是非问题。在你的问题领域写些有意义的东西。在
“不是绝对好,因为循环引用。”
为什么不呢?循环性在这里根本没有意义。双向关系是件好事。使用它们。Python垃圾可以很好地收集它们,而不用考虑您的问题。在
你对相互(双向)关系有什么可能的问题?在
“…只操作帐户,在帐户内部,处理程序运算符。这个有点限制,因为在这种情况下,我不能传递对运算符的引用。 ““
什么?你的操作符是Python对象,传递所有你想要的。所有Python对象(实际上)都是引用,不要担心。在
在操作操作符对象时,您可能会遇到什么问题?在
相关问题 更多 >
编程相关推荐