学点PYTHON基础的东东--数据结构,算法,设计模式---观察者模式

按照小明明的设计模式抄抄看看。。

http://dongweiming.github.io/python-observer.html

# 这个是观察者基类
class Subject(object):
    def __init__(self):
        self._observers = []

    # 添加依赖的对象
    def attach(self, observer):
        if not observer in self._observers:
            self._observers.append(observer)

    # 取消添加
    def detach(self, observer):
        try:
            self._observers.remove(observer)
        except ValueError:
            pass

    # 这里只是通知上面注册的依赖对象新的变化
    def notify(self, modifier=None):
        for observer in self._observers:
            # 可以设置过滤条件,对不符合过滤条件的更新
            if modifier != observer:
                observer.update(self)

# 观察者类
class Data(Subject):
    def __init__(self, name=‘‘):
        super(Data, self).__init__()
        self.name = name
        self._data = 0

    # python2.6新增的写法,获取属性为property,设置属性为(假设属性名字为x)@x.setter,删除为@x.deleter
    @property
    def data(self):
        return self._data

    @data.setter
    def data(self, value):
        self._data = value
        self.notify()

# 这里有2个被观察者,也就是依赖的对象,每次Data有改变,这2个view都会变动
class HexViewer(object):
    def update(self, subject):
        print ‘HexViewer: Subject %s has data 0x%x‘ % (subject.name, subject.data)

class DecimalViewer(object):
    def update(self, subject):
        print ‘DecimalViewer: Subject %s has data %d‘ % (subject.name, subject.data)

if __name__ == ‘__main__‘:

    data1 = Data(‘Data 1‘)
    data2 = Data(‘Data 2‘)
    view1 = DecimalViewer()
    view2 = HexViewer()
    data1.attach(view1)
    data1.attach(view2)
    data2.attach(view2)
    data2.attach(view1)

    print "Setting Data 1 = 10"
    data1.data = 10
    print "Setting Data 2 = 15"
    data2.data = 15
    print "Setting Data 1 = 3"
    data1.data = 3
    print "Setting Data 2 = 5"
    data2.data = 5
    print "Update data1‘s view2 Because view1 is be filtered"
    data1.notify(modifier=view1)
    print "Detach HexViewer from data1 and data2."
    data1.detach(view2)
    data2.detach(view2)
    print "Setting Data 1 = 10"
    data1.data = 10
    print "Setting Data 2 = 15"
    data2.data = 15

时间: 2024-10-19 22:43:48

学点PYTHON基础的东东--数据结构,算法,设计模式---观察者模式的相关文章

学点PYTHON基础的东东--数据结构,算法,设计模式---单向链表

看来看来,还是以下这个实现最优雅.. 其它的,要么NODE冗余,要么初始化丑陋... #!/usr/bin/env python # -*- coding: utf-8 -*- class Node: def __init__(self, initdata): self.__data = initdata self.__next = None def getData(self): return self.__data def getNext(self): return self.__next d

学点PYTHON基础的东东--数据结构,算法,设计模式---访问者模式

说实话,感觉不是特别多,可能没遇到过多场面, 所以对应用场景没感觉吧. 反正,各种模式就是把类的实例传来传去,久而久之,产生了一些规律...:) # 轮子,引擎, 车身这些定义好了都不需要变动 class Wheel: def __init__(self, name): self.name = name def accept(self, visitor): # 每个visitor是同样的,但是其中的方法是不一样的,比如这里是visitWheel, # 然后传入了self,想想?他其实想做什么就能

python基础篇(五)

python基础篇(五) 算法初识 什么是算法 二分查找算法 ?一:算法初识 A:什么是算法 根据人们长时间接触以来,发现计算机在计算某些一些简单的数据的时候会表现的比较笨拙,而这些数据的计算会消耗大量计算机资源,而且耗时,这个时候就有人对这类计算编写了一些策略,这些策略就是算法.这些策略会加快数据计算时间,大大减少计算机的资源消耗. 在长时间人们编写代码的工作中,一些优秀的算法就被流传下来,但是不是所有的算法都能实现目的一步到位的工作,它只能减少你的代码,提高工作效率,随着知识的不断积累,你会

零基础如何学习好Python开发?

Python是一门适合零基础学习的编程语言,该语言通俗易懂.容易入门,初学者的首选;作为一个零基础的小白,想要学习好Python课程,首先就是确定自己的目标.做好系统化规划等,才可以更好的掌握Python开发课程,下面就为大家详细的介绍一下Python学习方法吧. 1.明确学习目标:其实很多人在学习Python的时候,对它了解并不是很多,都是因为Python火或者薪资待遇高去学习.在这里提醒大家学习Python不能跟风,一定要确定自己是不是真心想要学习,自己需要学习到什么程度.在学习过程中可以指

Python基础之数据结构

Python中最基本的数据结构是序列,包括6种内建的序列,列表.元祖.字符串.Unicode字符串.buffer对象.xrange对象. 而列表和元组的主要区别在于,列表可以修改而元组不能修改. 通用的序列操作: 索引 实验一: a = 'nihao' 则a[0] 输出 'n' a[-1] 则输出'o' 索引0指向第一个元素,索引可以是负数,索引-1则指向倒数第一个元素 分片 和索引是类似的,索引是访问单个元素,分片则可以访问一定范围的元素.分片通过冒号隔开的两个索引实现,两个索引代表边界元素,

学爬虫,需要掌握哪些Python基础?

入手爬虫确实不要求你精通Python编程,但基础知识还是不能忽视的,那么我们需要哪些Python基础呢? 首先我们先来看看一个最简单的爬虫流程: 第一步要确定爬取页面的链接,由于我们通常爬取的内容不止一页,所以要注意看看翻页.关键字变化时链接的变化,有时候甚至要考虑到日期:另外还需要主要网页是静态.动态加载的. 第二步请求资源,这个难度不大,主要是Urllib,Request两个库的使用,必要时候翻翻官方文档即可 第三步是解析网页.请求资源成功后,返回的整个网页的源代码,这时候我们就需要定位,清

Python基础【数据结构:列表 | 元组 | 集合 | 字典】

序列 序列是Python中最基本的数据结构.包括字符串,列表,元组,Unicode字符串,buffer对象,xrange对象.序列中的每个元素都分配一个数字,即它的索引第一个索引是0,第二个索引是1,依此类推. 列表和元组 列表一个方括号内的逗号分隔值列表中可以存放不同的数据类型. 例:[1,1.2,True,'str',[2,False]]元组与列表类似,不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号. 例:(1,1.2,True,'str',[2,False]) 列表和元组的

带你学python基础:模块和包

一.什么是模块 在我们平时的开发过程中,或多或少会用到 Python 的一些内置的功能,或者说,还会用到一些第三方的库,我们用到的这些 Python 的内置的功能,和一些第三方的库,就可以说是一些模块了. 例如,我们在读写文件的时候,我们就会用到文件操作的模块os. 是不是经常遇到呢?模块,来了! 其实,每一个 Python 脚本文件都可以被当成是一个模块. 模块以磁盘文件的形式存在.当一个模块变得过大,并且驱动了太多功能的话,就应该考虑拆一些代码出来另外建一个模块. 模块里的代码可以是一段直接

python基础总结(基于2.7版本也适用于3.4)

言语介绍: Python(英语发音:/?pa?θ?n/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议[1].Python语法简洁而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起.常见的一种应用情形是,使用Python快速生成程序的原型(有时甚