当前位置: 首页 > 面试题库 >

Python观察者模式:示例,提示?

伍胡媚
2023-03-14
问题内容

是否有用Python实现的GoF
Observer的示例示例?我有一个位代码,当前有一些调试代码通过键类附加(如果设置了魔术环境,当前会向stderr生成消息)。此外,该类还具有一个接口,用于递增地返回结果以及将其存储在内存中以进行后处理。(该类本身是一个作业管理器,用于通过ssh在远程计算机上并发执行命令)。

当前,该类的用法类似于:

job = SSHJobMan(hostlist, cmd)
job.start()
while not job.done():
    for each in job.poll():
        incrementally_process(job.results[each])
        time.sleep(0.2) # or other more useful work
post_process(job.results)

一种替代用法模型是:

job = SSHJobMan(hostlist, cmd)
job.wait()  # implicitly performs a start()
process(job.results)

这对于当前的实用程序来说一切正常。但是,它确实缺乏灵活性。例如,我目前支持简短的输出格式或进度条作为增量结果,也支持该post_process()功能的简短,完整和“合并的消息”输出。

但是,我想支持多个结果/输出流(到终端的进度条,对日志文件的调试和警告,从成功作业到一个文件/目录的输出,错误消息以及从不成功作业到其他结果的其他结果)等)。

这听起来像是一种情况,要求Observer …让我的类的实例接受其他对象的注册,并在事件发生时使用特定类型的事件进行回调。

我正在查看PyPubSub,因为我在SO相关问题中看到了对此的一些引用。我不确定是否已准备好将外部依赖项添加到我的实用程序中,但是如果这样做可以使其他人更容易使用,则可以看到将其接口用作我的模型的价值。(该项目既可以用作独立的命令行实用程序,也可以用作编写其他脚本/实用程序的类)。

简而言之,我知道该怎么做…但是有很多方法可以实现它。从长远来看,我想就最可能对其他代码用户起作用的建议。

代码本身位于:classh。


问题答案:

但是,它确实缺乏灵活性。

好吧……实际上,如果您想要异步API,那么对我来说这似乎是一个不错的设计。通常是这样。也许您所需要的只是从stderr切换到Python的logging模块,该模块具有自己的发布/订阅模型,Logger.addHandler()以及诸如此类的东西。

如果您确实想支持观察者,我的建议是使其保持简单。您实际上只需要几行代码。

class Event(object):
    pass

class Observable(object):
    def __init__(self):
        self.callbacks = []
    def subscribe(self, callback):
        self.callbacks.append(callback)
    def fire(self, **attrs):
        e = Event()
        e.source = self
        for k, v in attrs.iteritems():
            setattr(e, k, v)
        for fn in self.callbacks:
            fn(e)

您的Job类可以子类化Observable。发生感兴趣的事情时,请致电self.fire(type="progress", percent=50)或类似电话。



 类似资料:
  • 主要内容:介绍,实现,Subject.java,Observer.java,BinaryObserver.java,OctalObserver.java,HexaObserver.java,ObserverPatternDemo.java当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知

  • 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)

  • 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 定义一个目标构造函数,并实现绑定、解绑和触发等方法: function Subject() { this.events = {}; this.count = 0; }​ Subj

  • 问题 当一个事件发生时你不得不向一些对象发布公告。 解决方案 使用观察者模式(Observer Pattern)。 class PostOffice constructor: () -> @subscribers = [] notifyNewItemReleased: (item) -> subscriber.callback(item) for s

  • 简介 观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 抽象目标类别 此抽象类别提供一个界面让观察者进行添附与解附作业。此类别内有个不公开的观察者串炼,并透过下列函式(方法)进行作业 添附(Attach):新增观察

  • 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)