通知容器对象:最佳实践

2024-05-15 05:12:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两门课:会计和操作员。帐户包含运算符列表。现在,每当操作员(在列表中)收到消息时,我都希望通知Account对象也执行一些业务逻辑。在

关于如何实现这一目标,我想到了三个备选方案:

1)在运算符内保存对容器[Account]对象的引用并直接调用方法。不是绝对好,因为循环引用。在

2)使用事件。据我所知,Python中没有内置的事件处理机制。所以,这个有点难实现。在

3)不要直接向操作员发送消息。相反,只操作帐户,并且在帐户内部操作处理程序运算符。这个有点限制,因为在这种情况下,我不能传递对运算符的引用。在

我想知道从架构的角度来看,哪种方法是最有利的。你通常如何处理这个任务?在

如果您能指出Python中的代码片段,那就太好了。在


Tags: 对象方法消息目标列表事件方案运算符
3条回答

我会使用事件处理。您不必自己实现它——我使用pydispatcher来处理这种事件,而且它总是很好地工作(它在内部使用弱引用,以避免循环引用问题)。在

另外,如果您使用的是gui框架,那么您可能已经有了一个可以挂接的事件框架,例如PyQt有信号和插槽。在

观察者模式没有“一刀切”的解决方案。但是通常,最好定义一个EventManager对象,在这个对象中,相关方可以注册自己的某些事件,并在事件发生时发布这些事件。它只会减少依赖性。在

请注意,您需要使用全局事件管理器实例,这在测试期间或从一般OO的角度(它是一个全局变量)可能会有问题。我强烈建议不要一直传递EventManager,因为那样会使代码混乱。在

在我自己的代码中,注册事件的“键”是事件的类。EventManager使用字典(event class->;观察者列表)来知道哪个事件会发生在哪里。在通知代码中,您可以使用dict.get(event.__class__, ())来查找侦听器。在

你想得太多了。说真的。Python不是C++,Python中的问题是非问题。在你的问题领域写些有意义的东西。在

“不是绝对好,因为循环引用。”

为什么不呢?循环性在这里根本没有意义。双向关系是件好事。使用它们。Python垃圾可以很好地收集它们,而不用考虑您的问题。在

你对相互(双向)关系有什么可能的问题?在

“…只操作帐户,在帐户内部,处理程序运算符。这个有点限制,因为在这种情况下,我不能传递对运算符的引用。 ““

什么?你的操作符是Python对象,传递所有你想要的。所有Python对象(实际上)都是引用,不要担心。在

在操作操作符对象时,您可能会遇到什么问题?在

相关问题 更多 >

    热门问题