python 设计模式,“多”例模式
版本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 设计模式,“多”例模式的更多相关文章
- python设计模式之命令模式
python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...
- Python设计模式之MVC模式
# -*- coding: utf-8 -*- # author:baoshan quotes = ('A man is not complete until he is married. Then ...
- python设计模式之模板模式
python设计模式之模板模式 编写优秀代码的一个要素是避免冗余.在面向对象编程中,方法和函数是我们用来避免编写冗余代码的重要工具. 现实中,我们没法始终写出100%通用的代码.许多算法都有一些(但并 ...
- python设计模式之状态模式
python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...
- python设计模式之解释器模式
python设计模式之解释器模式 对每个应用来说,至少有以下两种不同的用户分类. [ ] 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就 ...
- python设计模式之外观模式
python设计模式之外观模式 系统会随着演化变得非常复杂,最终形成大量的(并且有时是令人迷惑的)类和交互,这种情况并不少见.许多情况下,我们并不想把这种复杂性暴露给客户端.外观设计模式有助于隐藏系统 ...
- python设计模式之原型模式
python设计模式之原型模式 对于原型模式而言,其中最主要的部分就是关于一个对象的复制,其中就包含两个方面:1.浅复制:2.深复制.具体的区别请看我相关的随笔.这里简略的说明一下,浅复制就等于对 ...
- python设计模式之建造者模式
python设计模式之建造者模式 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...
- Python: 设计模式 之 工厂模式例(2)(神奇的Python)
#!/usr/bin/env python #coding=utf-8 # # 工厂模式第二例(神奇的Python) # 版权所有 2014 yao_yu (http://blog.csdn.net/ ...
- Python: 设计模式 之 工厂模式例(1)
#!/usr/bin/env python #coding=utf-8 # # 工厂模式一例 # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) ...
随机推荐
- python __name__ 变量的含义
python __name__ 变量的含义 if __name__ == '__main__': tf.app.run() 当python读入程序时,会初始化一些系统变量.如果当前程序是主程序,__n ...
- 1011. A+B和C (15)
/*1011. A+B和C (15) 时间限制150 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者HOU, Qiming给定区间[-231, 231]内的3个整数A ...
- AOP TP框架有感
自学AOP感觉面向切面编程是一种利器,同时也是一种潜在的威胁.他就像一把手术刀,无论哪个器官有问题他都可以把他切开,修复它,但是使用的多了身体也会受不了... AOP应该算是面向对象的一种补充,但是, ...
- 201521123082 《Java程序设计》第6周学习总结
201521123082 <Java程序设计>第6周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念 ...
- java201521123118《java程序设计》第3周总结
1. 本周学习 总结初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面作 ...
- 201521123034 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...
- YYHS-Floor it
题目描述 输入 输出 样例输入 5 97 样例输出 11 提示 题解 先不管p,通过列举前面几项,不难发现当i为偶数时,a[i]=a[i-1]+a[i-2],当i为奇数时,a[i]=a[i ...
- mongodb 常用的命令
mongodb 常用的命令 对数据库的操作,以及登录 1 进入数据库 use admin 2 增加或修改密码 db.addUser('wsc', '123') 3查看用户列表 db.system.us ...
- ubuntu下程序员常用命令大全
一.ubuntu下用命令查询系统版本 1.在终端中执行下列指令: cat /etc/issue 该命令可查看当前正在运行的ubuntu的版本号. 效果如图: 2.使用 lsb_release 命令也可 ...
- WILL吃桃_KEY
WILL 吃桃 (peach.pas/c/cpp) [ 题目描述] Will 很喜欢吃桃, 某天 Will 来到了一片森林, 森林中有 N 颗桃树, 依次编号为 1,2,„,N.每棵树上有数量不等的桃 ...