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) ...
随机推荐
- 转:Java IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- JavaScript 的使用基础总结③
JavaScript 中的对象 JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... JavaScript 允许自定义对象. (一)数组 数组对象的作用是:使用单独的变量名来存储 ...
- 201521123007《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题目4-1) private static ...
- 201521123040 《Java程序设计》第6周学习总结
1.本章学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 clone方法1.1 Object对象中的c ...
- 201521123029《Java程序设计》第五周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 答:1. 课上讲了匿名内部类的使用,其中内部类就是定义在另一个类里面的类,与之相 ...
- 201521123070 《JAVA程序设计》第5周学习总结
1. 本章学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. http://naotu.baidu.com/file/02b01f465e125c5942648a03358273b0 2. ...
- 201521123101 《Java程序设计》第1周学习总结
1. 本周学习总结 在学习Java之前要做好准备工作,了解Java从研发后开始如何一步步完善,其与C++.C语言的异同,然后下载JDK.Eclipse.Notepad等软件,以便于未来的学习. 2. ...
- js中变量base64加密传输
首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01 ...
- Java内部类的总结
内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. 内部类分为: 成员内部类.局部内部类.静态嵌套类.匿名内部类 . 1.成员内部类 成员内部类是最普通的内部类,它的定义为位于另一个类 ...
- Exception in thread "main" org.hibernate.MappingException: You may only specify a cache for root
如果出现类似下面的错误: Exception in thread "main" org.hibernate.MappingException: You may only speci ...