python 设计模式,“多”例模式
时间:2022-05-02
本文章向大家介绍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('111', '还没有任何司机登录' , '我是司机')
print u1, u1.phone, u1.say, u1.info
u2 = Driver('222', '我还没哟登录', '我是司机')
print u2, u2.phone, u2.say, u2.info
u3 = Driver('222', '我已经登录了', '我是司机')
print u3,u3.phone,u3.say, u3.info
u4 = Passenger('444', '我还没有登录', '我是乘客')
print u4,u4.phone,u4.say, u4.info
u4 = Passenger('222', '我作为司机登录过了', '我是乘客')
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('111', '还没有任何司机登录' , '我是司机')
print u1, u1.phone, u1.say, u1.info
u2 = Driver('222', '我还没哟登录', '我是司机')
print u2, u2.phone, u2.say, u2.info
u3 = Driver('222', '我已经登录了', '我是司机')
print u3,u3.phone,u3.say, u3.info
u4 = Passenger('444', '我还没有登录', '我是乘客')
print u4,u4.phone,u4.say, u4.info
u4 = Passenger('222', '我作为司机登录过了', '我是乘客')
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 我是乘客 我作为司机登录过了
- java获取properties配置文件值
- 安全退出app,activoty栈管理
- JavaBean转Map方法
- JsBridge实现JavaScript和Java的互相调用
- JAVA-FTP批量大文件传输
- 独家 | 一文读懂TensorFlow(附代码、学习资料)
- 解决openssh漏洞,升级openssh版本
- 解决NTPD漏洞,升级Ntpd版本
- 独家 | 手把手教TensorFlow(附代码)
- HBase Region自动切分细节
- eclipse搭建ssh后台
- 解决mysql漏洞 Oracle MySQL Server远程安全漏洞(CVE-2015-0411)
- im4java包处理图片
- centOS7 mini配置linux服务器(五) 安装和配置tomcat和mysql
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 哈工大李治军操作系统课程实验环境搭建
- 我用 OpenGL 实现了那些年流行的相机滤镜
- 使用minikube安装kubernetes和dashboard
- FFmpeg + OpenGLES 实现视频解码播放和视频滤镜
- 行为型设计模式:模板模式
- 容器中的隔离与限制:namespace和cgroups
- 行为型设计模式:策略模式
- redis实战第十二篇 redis cluster请求重定向
- 行为型设计模式:责任链模式以及mybatis中的责任链
- java中BigDecimal使用和注意事项
- redis实战第十一篇 redis cluster添加密码
- Linux下docker制作springboot应用镜像
- 行为型设计模式:备忘录模式
- 行为型设计模式:访问者模式
- redis实战第十篇 集群收缩