版本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. 在windows中,使用SSH登录VMware ubuntu linux虚拟机

    测试环境 主机:window7 sp1 64位 专业版 虚拟机:VMware workstation 12 player 虚拟机操作系统: ubuntu 16.4 目标:在ubuntu下运行SSH服务 ...

  2. Java学习记录:文件的输入输出流

    Java中的输入.输出流中可以用于文件的读写,拷贝. 由于文件都是由字节组成的,可以将文件中的内容以字节的方式读取出来. 输入流还可以直接转换为图片来使用.其实ImageIcon提供了方法可以直接打开 ...

  3. CCIE-MPLS基础篇-实验手册

    又一部前期JUSTECH(南京捷式泰)工程师职业发展系列丛书完整拷贝. MPLS(Multi-Protocol Label Switching) 目录 1:MPLS 基础实验.... 1.1实验拓扑. ...

  4. 防止fixed元素遮挡其他元素的方法

    有多个页面,有的有固定的头部(设置了postion:fixed的元素),有的没有固定的头部,这时就有个问题,有固定头部的页面,头部会遮挡下面的内容,那怎么解决呢? <!DOCTYPE html& ...

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

    1. 本周学习总结 2. 书面作业 作业参考文件下载 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出 ...

  6. 201521123092《java程序设计》第四周学习总结

    1.本周学习总结 #1.尝试使用思维导图总结有关继承的知识点. #2.使用常规方法总结其他上课内容. 本周主要学习了继承的相关知识,用关键词extends来定义一个类,被继承的类叫做父类,继承的类叫做 ...

  7. php中获取当前系统时间、时间戳

    今天写下otime($time, $now)为将时间格式转为时间戳,$time为必填.清楚了这个,想了解更多,请继续往下看. 3. date($format)用法比如:echo date(‘Y-m-d ...

  8. apache: apache-tomcat-6.0.35完整下载

    Index of /dist/tomcat/tomcat-6/v6.0.35/bin Name Last modified Size Description Parent Directory - ex ...

  9. linux下修改rm命令防止误删除

    前言:相信很多朋友都遇到过在linux下用rm命令误删除文件的时候,此刻的心中仿佛有无数的羊驼在奔腾.那么怎么防止这种情况发生呢?当然是有方法的,我们可以写一个shell脚本,改变一下rm命令的作用. ...

  10. Servlet知识点大纲

    这是我整理的Servlet知识点大纲,可按照它的顺序来学习-..具体的内容在我的博客中都可以找到!