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 ...
随机推荐
- 使用Spring ThreadPoolTaskExecutor实现多线程任务
我们为何使用多线程,之前已经有讲过了,为了更快的处理多个任务,分割任务,或者调用多个毫无关联的第三方服务 其实spring就提供了ThreadPoolTaskExecutor这个类来实现线程池,线程池 ...
- Codeforces 715B. Complete The Graph 最短路,Dijkstra,构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF715B.html 题解 接下来说的“边”都指代“边权未知的边”. 将所有边都设为 L+1,如果dis(S,T ...
- drf视图组件、认证组件
视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...
- python 类和元类(metaclass)的理解和简单运用
(一) python中的类 首先这里讨论的python类,都基于继承于object的新式类进行讨论. 首先在python中,所有东西都是对象.这句话非常重要要理解元类我要重新来理解一下python中的 ...
- http连接基础类,负责底层的http通信
/// <summary> /// http连接基础类,负责底层的http通信 /// </summary> public class HttpService { public ...
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Khamovniki
A. Ability Draft 记忆化搜索. #include<stdio.h> #include<iostream> #include<string.h> #i ...
- 判断点在不在多边形范围内c#
C# 计算地图上某个坐标点的是否在多边形内 这个方法引用自群友的博客 https://www.xiaofengyu.com/?p=143 使用百度地图的时候,常常会用到判断一个点是否在一个多边形的 ...
- linux进阶指令
1.df 查看磁盘空间 2.free 查看内存使用 -m 表示以mb位单位查看 total 总大小 used 使用过的空间 free 空闲的空间 shared 共享内存 buffer ...
- BOM 浏览器对象模型_不超过 4 KB 的 document.cookie 对象
注意: 客户端储存应该使用 Web storage API 和 IndexedDB,不推荐使用 Cookie document.cookie 对象 是服务器保存在浏览器的一小段文本信息 用于读写当前网 ...
- 微信公众号_订阅号_爬虫puppeteer
puppeteer 借助 puppeteer 库实现爬虫,puppeteer 提供了高级 api 接口来操作 chrome 来 npm install puppeteer --save-dev ...