昨天发现一个负责处理观察者模式的基类工作失败,默认的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的原因很简单,但是比较有意思,特此记录一下,希望帮助出现同样问题的人~

最新文章

  1. Maven 常用的命令
  2. javascript获取表单值的7种方式
  3. oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT
  4. opencv6.4-imgproc图像处理模块之直方图与模板
  5. swift中的结构体和枚举
  6. hdu 4418 Time travel 概率DP
  7. linux lnmp编译安装
  8. dapper 写查询sql 时,多条件参数操作方法
  9. Java 文件操作大全
  10. [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码
  11. iOStextView的代理方法展示
  12. select into
  13. [蓝桥杯]2015蓝桥省赛B组题目及详解
  14. APP界面设计 大概总结
  15. Mybatis(五) 延迟加载和缓存机制(一级二级缓存)
  16. MySQL8.0 优化
  17. nginx里proxy_pass有无/的区别
  18. MySQL创建外键约束的报错Error : Can't create table '#sql-534_185' (errno: 150)
  19. 基于SecureCRT的测试环境的克隆的linux/vi相关命令
  20. Spring JdbcTemplate 查询结果集Map反向生成Java实体(转)

热门文章

  1. css笔记16:盒子模型的入门案例
  2. github使用成长记
  3. 在vs环境中跑动sift特征提取(原理部分)
  4. bootstrap的滚动监听
  5. 安装SqlServer2008时相关问题
  6. Apache Commons 简述
  7. unity3d鼠标经过物体时变颜色,离开时恢复
  8. jQuery API 3.1.0 速查表-打印版
  9. iOS夯实:内存管理
  10. Win7中修改Chrome浏览器缓存文件目录