#单例模式:有时需要写出高性能的类,那么会采用单例模式。通俗的解释就是类只创建一次实例,贯穿整个生命周期,实现了高性能。

#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之单例模式的更多相关文章

  1. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  2. Python 基于python实现单例模式

    基于python实现单例模式 by:授客 QQ:1033553122   概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...

  3. python 以单例模式封装logging相关api实现日志打印类

    python 以单例模式封装logging相关api实现日志打印类   by:授客QQ:1033553122 测试环境: Python版本:Python 2.7   实现功能: 支持自由配置,如下lo ...

  4. python的单例模式:

    python的单例模式:http://funhacks.net/2017/01/17/singleton/ https://www.cnblogs.com/huchong/p/8244279.html ...

  5. 【Python】单例模式Singleton

    前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现...然后就想不起来了. 之后翻书,原来这些之前都见过的啊.... 1.手动实现真正创建实例的方法__new__()来实 ...

  6. 浅谈Python设计模式 - 单例模式

    本篇主要介绍一下关于Python的单例模式,即让一个类对象有且只有一个实例化对象. 一.使用__new__方法(基类) 要实现单例模式,即为了让一个类只能实例化一个实例,那么我们可以去想:既然限制创建 ...

  7. 【python】Python的单例模式

    原文:http://blog.csdn.net/ghostfromheaven/article/details/7671853 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某 ...

  8. python实现单例模式

    有这么一种场景,我们把数据封装到类体或类的某个方法里,然而我们new出这个类只是为了拿到这部分数据,那么当多次这样调用的时候,每次都来拿数据并放到内存中大大浪费了内存. 那我们就可以想,我们拿到一次数 ...

  9. Python 实现单例模式的一些思考

    一.问题:Python中如何实现单例模式 单例模式指一个类只能实例化一个对象. 二.解决方案: 所有资料参考于: http://python.jobbole.com/87294/ https://ww ...

  10. python之单例模式、栈、队列和有序字典

    一.单例模式 import time import threading class Singleton(object): lock = threading.RLock() # 定义一把锁 __inst ...

随机推荐

  1. oracle导入.dmp文件

    在日常开发中,经常需要往一个数据库里导入.dmp文件,下面简单介绍下如何通过命令导入 1.创建一个awsbpm用户create user 用户名 identified by 密码; 如:create ...

  2. 使用mybatis assembly插件打成tar包,在linux系统中运行服务

    使用mybatis assembly插件打成tar包,在linux系统中运行服务 assembly插件插件地址: 链接:https://pan.baidu.com/s/1i6bWPxF 密码:gad5 ...

  3. XVII Open Cup named after E.V. Pankratiev. GP of Two Capitals

    A. Artifact Guarding 选出的守卫需要满足$\max(a+b)\leq \sum a$,从小到大枚举每个值作为$\max(a+b)$,在权值线段树上找到最大的若干个$a$即可. 时间 ...

  4. 【IT小常识】如何将IE手动升级或降级

    我们从浏览器任意下载一个我们需要安装的IE版本.可能部分电脑的IE版本不是微软正版的IE版本,所以无法通过更新来获取我们想要的IE版本. 下面,详细的讲一下如何如何手动升级IE或者吧IE降级. 一. ...

  5. GMA Round 1 新年的复数

    传送门 新年的复数 已知$\left\{\begin{matrix}A>B>0\\ AB=1\\ (A+B)(A-B)=2\sqrt{3}\end{matrix}\right.$ 求$(A ...

  6. 使用Eclipse中的SVN提交代码遇到的问题

    问题: Previous operation has not finished; run 'cleanup' if it was interrupted svn: Commit failed (det ...

  7. Zepto.js_开始

    https://zeptojs.com 轻量级的 JavaScript 库,移动端优先框架 针对移动端,处理了一系列如 click 点击延迟 毫秒 响应执行快 目前 API 完善的框架中体积最小的一个 ...

  8. [LeetCode] Unique Morse Code Words 独特的摩斯码单词

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

  9. chrome 安装setupvpn 解决chorme未能成功加载扩展程序的问题

    一: vpn文件    https://pan.baidu.com/s/1wZV2HAC3GHlh1bjlvbilRg 提取码:  gz72; 二 : 安装步骤 ------请看完以下步骤,不要直接拖 ...

  10. css 图片置灰

    .filterGray{ -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(10 ...