python之单例模式
#单例模式:有时需要写出高性能的类,那么会采用单例模式。通俗的解释就是类只创建一次实例,贯穿整个生命周期,实现了高性能。 #1.模块化单例
#所谓的模块化就是一个单独的.py文件来存储类,这样就是单例模式。
#其原理就是模块被导入时会产生一个.pyc文件,其它文件在导入的时候不会在去调用。直接读取pyc #2.装饰器单例模式
#原理也很简单,用装饰器装饰类。
#装饰器本身实现,传入类对象,进行判读是不是一个实例,如果是直接返回该实例(需要注意是直接返回,不再创建)。
#如果不是一个实例,那么创建该实例,并把该实例保存在一个变量中,用来标记实例已被创建。 #实现单例模式装饰器
def sing(cls):
save_instance = {} def _wrap(*args, **kwargs):
#如果cls没在save_instance中说明,cls是第一次创建实例
if not 'cls' in save_instance:
save_instance['cls'] = cls(*args, **kwargs) #注意这里的括号,实例化一个类要带括号否则就是类对象
return save_instance['cls'] #把实例返回。
return _wrap
示例1:
class Sing_Cls_Demo():
def __init__(self, x, y):
self.x = x
self.y = y
a1 = Sing_Cls_Demo(1, 2)
a2 = Sing_Cls_Demo(3, 4)
print(a1)
print(a2)
#示例1结果:从以下结果可以看出,不是同一个实例对象
# <__main__.Sing_Cls_Demo object at 0x036692B0>
# <__main__.Sing_Cls_Demo object at 0x03669730>
示例2:
@sing
class Sing_Cls_Demo(): def __init__(self, x, y):
self.x = x
self.y = y a1 = Sing_Cls_Demo(1, 2)
a2 = Sing_Cls_Demo(3, 4)
print(a1)
print(a2)
#示例2结果:给类带上装饰器,从结果看出,两个类初始化,只创建了一个实例。
# <__main__.Sing_Cls_Demo object at 0x034D9050>
# <__main__.Sing_Cls_Demo object at 0x034D9050>
#3类模式的单例
#原理其实一样,我们先在类中埋一个属性,或者一个变量也可以。之后判断这个是否存在预设标记,存在原样返回。不存在创建返回。
#以下代码只是类实现的一种方例。
class Sing():
def __init__(self, x, y):
self.x = x
self.y = y #这里我们通过方法来给类做标记。 实例化时也调用该方法。
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(Sing,'instance_flag'): #判断如果没有这个属性,说明类没被实例化过。
Sing.instance_flag = Sing(*args, **kwargs)
return Sing.instance_flag a1 = Sing.instance(1, 2)
a2 = Sing.instance(3, 4) print(a1)
print(a2)
#输出结果,可以看出是同一实例对象。
# <__main__.Sing object at 0x03479730>
# <__main__.Sing object at 0x03479730>
#以上存在的问题。如果是多线程下有概率的会出现问题。可以加上线程锁来解决这问题。
#4__new__模式
原理是一样的,不在重复。 在python中类被实例化的时候最先执行的是__new__
文章就是从__new__开始。在这里做判断,第一次实例一下返回,不是第一次原样返回。
python之单例模式的更多相关文章
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- Python 基于python实现单例模式
基于python实现单例模式 by:授客 QQ:1033553122 概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...
- python 以单例模式封装logging相关api实现日志打印类
python 以单例模式封装logging相关api实现日志打印类 by:授客QQ:1033553122 测试环境: Python版本:Python 2.7 实现功能: 支持自由配置,如下lo ...
- python的单例模式:
python的单例模式:http://funhacks.net/2017/01/17/singleton/ https://www.cnblogs.com/huchong/p/8244279.html ...
- 【Python】单例模式Singleton
前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现...然后就想不起来了. 之后翻书,原来这些之前都见过的啊.... 1.手动实现真正创建实例的方法__new__()来实 ...
- 浅谈Python设计模式 - 单例模式
本篇主要介绍一下关于Python的单例模式,即让一个类对象有且只有一个实例化对象. 一.使用__new__方法(基类) 要实现单例模式,即为了让一个类只能实例化一个实例,那么我们可以去想:既然限制创建 ...
- 【python】Python的单例模式
原文:http://blog.csdn.net/ghostfromheaven/article/details/7671853 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某 ...
- python实现单例模式
有这么一种场景,我们把数据封装到类体或类的某个方法里,然而我们new出这个类只是为了拿到这部分数据,那么当多次这样调用的时候,每次都来拿数据并放到内存中大大浪费了内存. 那我们就可以想,我们拿到一次数 ...
- Python 实现单例模式的一些思考
一.问题:Python中如何实现单例模式 单例模式指一个类只能实例化一个对象. 二.解决方案: 所有资料参考于: http://python.jobbole.com/87294/ https://ww ...
- python之单例模式、栈、队列和有序字典
一.单例模式 import time import threading class Singleton(object): lock = threading.RLock() # 定义一把锁 __inst ...
随机推荐
- c++ typeid
简单使用 #include<iostream> #include<string> #include<new> #include<typeinfo> us ...
- 【转】Java Socket编程基础及深入讲解
原文:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html#q2.3.3 Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要 ...
- python之cookie, cookiejar 模拟登录绕过验证
0.思路 如果懒得模拟登录,或者模拟登录过于复杂(多步交互或复杂验证码)则人工登录后手动复制cookie(或者代码读取浏览器cookie),缺点是容易过期. 如果登录是简单的提交表单,代码第一步模拟登 ...
- 一道很经典的 BFS 题
一道很经典的 BFS 题 想认真的写篇题解. 题目来自:https://www.luogu.org/problemnew/show/P1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运 ...
- JMeter命令模式下动态设置线程组和持续时间等动态传参
背景: 1.当通过JMeter的图像化界面运行性能压测或者场景时候,JMeter界面很容易导致界面卡死或者无响应的情况(20个线程数就会卡死) 现象如下:
- [P3676]小清新数据结构题
Description: 给你一棵树,每次询问以一个点为根时所有子树点权和的平方和 带修改 Hint: \(n\le 2*10^5\) Solution: 这题只要推出式子就很简单了 如果不换根这个平 ...
- 11 安装已集成HA的树莓派镜像Hassbian
2017-09-04 10:40:47 下载Hassbian镜像文件,浏览https://github.com/home-assistant/pi-gen/releases/tag/v1.23,查看最 ...
- debian包的补丁管理工具:quilt
最近项目是改pam软件包,给里面添加一些功能.其中遇到了更改后,代码提交方式的问题.这里转载的文章介绍了使用quilt管理补丁的详细方法: 转自:http://blog.csdn.net/fmddlm ...
- CentOS7 安装 jexus-5.8.2-x64
前要提示: 如果你要安装asp.net 请参考: http://www.cnblogs.com/xiaoruilin/p/7867823.html 背景: CentOS7 Mono (Mono JIT ...
- node 学习(一)
什么是 Node.js Node.js就是运行在服务端的JavaScript. Node.js是一个基于Chrome JavaScript运行时建立的一个平台. Node.js是一个事件驱动 I/O ...