昨天发现一个负责处理观察者模式的基类工作失败,默认的N个观察者负责处理 发送的一些东西,
其中提供一个内置接口移除观察者:
def removeObserver(self, observer): if observer in self.observers: self.observers.remove(observer) logging.debug('remove %s', observer) else: logging.error('obj is %s , self obj is ' % (observer, self.observers)) logging.debug('removed %s finished' % observer)
提供一个外置接口,供管理方移除观察者:
def removeAllObserver(self): for ob in self.observers: try: self.removeObserver(ob) logging.debug('Rm %s' % ob) except Exception, e: logging.error('Rm failed : %s' % e)
让 observers = [s]
info.removeAllObserver()
这样看起来一切都很美好
继续, s1,s2,s3 三个sender在observers列表中
observers = [s1,s2,s3]
那么当调用 removeAllObserver()时, 美好的东西破碎了
仔细想想for 循环的实现, 没错,猜对了。 用了迭代器的for 循环,每次循环都只会获取一次条件中的__iter__函数来得到next()
def removeKey(src, obj): d.remove(obj) if __name__ == '__main__': d = ['a','b','c'] for each in d: removeKey(d,each) print d
大家可以想一下输出结果是什么~
bug的原因很简单,但是比较有意思,特此记录一下,希望帮助出现同样问题的人~