版本1:一个账号不能同时是司机乘客。

#-*- coding:utf-8 -*-
'''
Created on 2016年8月2日 @author: yangfanholiday
''' class User(object): __doc__ = '在不改变case代码情况下,防止重复login,不会被其他case登录顶掉(并发),类似单例模式的demo,核心代码是User类的__new__部分,将这部分复制到需要的类中即可' def __init__(self, phone, info):
self.phone = phone
self.info = info def __new__(cls, *args):
phone = args[0]
if not hasattr(cls, '_users'):
cls._users = list()
orig = super(User, cls)
ob = orig.__new__(cls)
cls._users.append(ob)
elif not reduce(lambda x,y: x or y, map(lambda x:x.phone == phone, cls._users), False):
orig = super(User, cls)
ob = orig.__new__(cls)
cls._users.append(ob)
else:
for u in cls._users:
if u.phone == phone:
ob = u
return ob class Driver(User):
def __init__(self, phone, info, say):
self.say = say
User.__init__(self, phone, info) class Passenger(User):
def __init__(self, phone, info, say):
self.say = say
User.__init__(self, phone, info) u1 = Driver('', '还没有任何司机登录' , '我是司机')
print u1, u1.phone, u1.say, u1.info u2 = Driver('', '我还没哟登录', '我是司机')
print u2, u2.phone, u2.say, u2.info u3 = Driver('', '我已经登录了', '我是司机')
print u3,u3.phone,u3.say, u3.info u4 = Passenger('', '我还没有登录', '我是乘客')
print u4,u4.phone,u4.say, u4.info u4 = Passenger('', '我作为司机登录过了', '我是乘客')
print u4,u4.phone,u4.say, u4.info 输出:
<__main__.Driver object at 0x10de2ba10> 111 我是司机 还没有任何司机登录
<__main__.Driver object at 0x10de2ba50> 222 我是司机 我还没哟登录
<__main__.Driver object at 0x10de2ba50> 222 我是司机 我已经登录了
<__main__.Passenger object at 0x10de2bad0> 444 我是乘客 我还没有登录
<__main__.Driver object at 0x10de2ba50> 222 我是司机 我已经登录了 版本2:一个账号可以登录司机乘客各一次
#-*- coding:utf-8 -*-
'''
Created on 2016年8月2日 @author: yangfanholiday
''' class User(object): __doc__ = '在不改变case代码情况下,防止重复login,不会被其他case登录顶掉(并发),类似单例模式的demo,核心代码是User类的__new__部分,将这部分复制到需要的类中即可' def __init__(self, phone, info):
self.phone = phone
self.info = info class Driver(User):
def __init__(self, phone, info, say):
self.say = say
User.__init__(self, phone, info) def __new__(cls, *args):
phone = args[0]
if not hasattr(cls, '_users'):
cls._users = list()
orig = super(User, cls)
ob = orig.__new__(cls)
cls._users.append(ob)
elif not reduce(lambda x,y: x or y, map(lambda x:x.phone == phone, cls._users), False):
orig = super(User, cls)
ob = orig.__new__(cls)
cls._users.append(ob)
else:
for u in cls._users:
if u.phone == phone:
ob = u
return ob class Passenger(User):
def __init__(self, phone, info, say):
self.say = say
User.__init__(self, phone, info) def __new__(cls, *args):
phone = args[0]
if not hasattr(cls, '_users'):
cls._users = list()
orig = super(User, cls)
ob = orig.__new__(cls)
cls._users.append(ob)
elif not reduce(lambda x,y: x or y, map(lambda x:x.phone == phone, cls._users), False):
orig = super(User, cls)
ob = orig.__new__(cls)
cls._users.append(ob)
else:
for u in cls._users:
if u.phone == phone:
ob = u
return ob
u1 = Driver('', '还没有任何司机登录' , '我是司机')
print u1, u1.phone, u1.say, u1.info u2 = Driver('', '我还没哟登录', '我是司机')
print u2, u2.phone, u2.say, u2.info u3 = Driver('', '我已经登录了', '我是司机')
print u3,u3.phone,u3.say, u3.info u4 = Passenger('', '我还没有登录', '我是乘客')
print u4,u4.phone,u4.say, u4.info u4 = Passenger('', '我作为司机登录过了', '我是乘客')
print u4,u4.phone,u4.say, u4.info 输入:
<__main__.Driver object at 0x105e23ad0> 111 我是司机 还没有任何司机登录 <__main__.Driver object at 0x105e2fc10> 222 我是司机 我还没哟登录 <__main__.Driver object at 0x105e2fc10> 222 我是司机 我已经登录了 <__main__.Passenger object at 0x105e2fc50> 444 我是乘客 我还没有登录 <__main__.Passenger object at 0x105e2fcd0> 222 我是乘客 我作为司机登录过了

python 设计模式,“多”例模式的更多相关文章

  1. python设计模式之命令模式

    python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...

  2. Python设计模式之MVC模式

    # -*- coding: utf-8 -*- # author:baoshan quotes = ('A man is not complete until he is married. Then ...

  3. python设计模式之模板模式

    python设计模式之模板模式 编写优秀代码的一个要素是避免冗余.在面向对象编程中,方法和函数是我们用来避免编写冗余代码的重要工具. 现实中,我们没法始终写出100%通用的代码.许多算法都有一些(但并 ...

  4. python设计模式之状态模式

    python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...

  5. python设计模式之解释器模式

    python设计模式之解释器模式 对每个应用来说,至少有以下两种不同的用户分类. [ ] 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就 ...

  6. python设计模式之外观模式

    python设计模式之外观模式 系统会随着演化变得非常复杂,最终形成大量的(并且有时是令人迷惑的)类和交互,这种情况并不少见.许多情况下,我们并不想把这种复杂性暴露给客户端.外观设计模式有助于隐藏系统 ...

  7. python设计模式之原型模式

    python设计模式之原型模式 ​ 对于原型模式而言,其中最主要的部分就是关于一个对象的复制,其中就包含两个方面:1.浅复制:2.深复制.具体的区别请看我相关的随笔.这里简略的说明一下,浅复制就等于对 ...

  8. python设计模式之建造者模式

    python设计模式之建造者模式 ​ 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...

  9. Python: 设计模式 之 工厂模式例(2)(神奇的Python)

    #!/usr/bin/env python #coding=utf-8 # # 工厂模式第二例(神奇的Python) # 版权所有 2014 yao_yu (http://blog.csdn.net/ ...

  10. Python: 设计模式 之 工厂模式例(1)

    #!/usr/bin/env python #coding=utf-8 # # 工厂模式一例 # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) ...

随机推荐

  1. 个人作业2 — 英语学习APP的案例分析

    一.调研准备:   1.软件:必应词典   2.平台:安卓   3.bug定义:(引用自<构建之法>13.1节)    Bug:软件的缺陷    Bug可以分解为:症状(Symptom). ...

  2. 201521123016 《Java程序设计》第7周学习总结

    1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { re ...

  3. 201521123121 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句 ...

  4. 201521123070 《JAVA程序设计》第4周学习总结

    1. 本章学习总结 1.1 尝试使用思维导图总结有关继承的知识点. http://naotu.baidu.com/file/4de6f42e4f4f6cce0531dd9997b04e60?token ...

  5. 201521123096《Java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 继承能够动态绑定,运行时能够自动的选择调用方法,十分方便. 2. 书面作业 (1)注释的应用 ...

  6. 201521123059 《Java程序设计》第一周学习总结

    第一周学习总结 1.本周学习总结 开学第周我们开始了JAVA学习,刚开始还有点懵,连熟悉相关的软件都要摸索很久,最后在看老师给的一些教程和课本的情况下安装了JDK和eclipse等软件,并进行了一次实 ...

  7. 201521123011 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 协议.IP.域名.端口: 常用应用层协议:http, ftp 域名(通过域名可以找到IP)用ping测试 ...

  8. D3--数据可视化实战总结

    d3理解 标签(空格分隔): 未分类 1.绑定数据 [x] 定义:通过循环的方式将数据绑定在dom元素上,每个数据对应一个元素,所以这个数据的值就能来设定dom元素的width,height,x,y坐 ...

  9. Html在线编辑器--基于Jquery的xhEditor轻量级编辑器

    xhEditor V1.2.2 下载地址 开源中国社区: http://www.oschina.net/p/xheditor xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化XHT ...

  10. Hibernate中的主键生成器generator

    本文讲述Hibernate的generator属性的意义.Generator属性有7种class,本文简略描述了这7种class的意义和用法. [xhtml] view plaincopy <c ...