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 ...
随机推荐
- kth min_max容斥
题解: 普通的$min-max$容斥是用来求最后出现元素的期望之类的 $kth min-max$容斥进一步解决倒数第k个出现的元素的期望 给出公式: $kthmax(S)=\sum\limits_{T ...
- 动态dp
题解: 首先这类题目本身是一个dp/树形dp 然后带上了修改(ddp) 为了权衡查询和修改的时间,我们采用树剖来维护 假设我们能够对每个点维护除了重儿子之外的信息 那么我们的修改只需要修改log个节点 ...
- matplotlib注解-【老鱼学matplotlib】
本节讲述在图片中添加注解. 直接上代码: import numpy as np import pandas as pd import matplotlib.pyplot as plt # 生成x轴上的 ...
- c++中字符串的反转
1.对于用char定义的字符串:使用string.h中的strrev函数 #include <iostream> #include <cstring> using namesp ...
- Ubuntu16.04 14.04安装配置Caffe(GPU版)
caffe配置过程很长啊,坑非常多,没有linux基础的估计会香菇的.我参考了网上很多的帖子,基本上每个帖子都有或多或少的问题,研究很久最终配置成功.参考过的帖子太多,都记不太清来源了.为了对前人的感 ...
- React(v16.8.4)生命周期详解
当前版本v16.8.4 装载过程(组件第一次在DOM树中渲染的过程): constructor(常用) -> getInitialState(v16.0已废弃) -> getDefault ...
- Android Frameworks的base目录内容分析 “Android Frameworks base”
Framework文件夹中base目录下文件分类: Android系统结构框架: Android Framework层各文件夹功能分类:
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Khamovniki
A. Ability Draft 记忆化搜索. #include<stdio.h> #include<iostream> #include<string.h> #i ...
- 微信公众号_订阅号_微信JS-SDK网页开发
微信JS-SDK( 分享接口很常用 ) 是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包 借助微信高效使用相机.语音.选题.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.支付等 ...
- react_app 项目开发 (2)_axios_pubsub-js
生产环境打包并运行 yarn run build 会src代码进行打包处理,在内存中生成打包文件 将打包文件保存至内存 yarn global add serve serve -s build 将 b ...