python之单例设计模式
设计模式之单例模式
单例设计模式是怎么来的?
在面向对象的程序设计中,当业务并发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,那么有没有办法使用得内存对象只创建一次,然后再随处使用呢?单例模式就是为了解决这个问题而产生的。
实现方式:
1、创建一个类静态字段(类变量)__instance
2、创建一个静态函数,通过函数的逻辑判断 __instance 是否已存在,如不存在就将对象值赋于__instance,即__instance = 类(),否则直接返回__instance,也即创建的对象都是一样的
3、使用单例模式创建对象时直接通过类调用静态函数创建即可
#普通模式
class A(object):
def __init__(self,name,male):
self.name = name
self.name = male #实例化多个对象
obj1 = A('ben','boy')
obj2 = A('min','girl')
obj3 = A('miao','boy')
##打印内存地址,可以看到内存地址都是不一样的
print id(obj1),id(obj2),id(obj3) #单例模式
class A(object):
__instance = None
def __init__(self,name,male):
self.name = name
self.name = male
@staticmethod
def create_obj():
if not A.__instance:
A.__instance = A('ben','boy')
return A.__instance
else:
return A.__instance #单例模式实例化多个对象
obj1 = A.create_obj()
obj2 = A.create_obj()
obj3 = A.create_obj()
##打印内存地址,可以看到内存地址都是一样的
print id(obj1),id(obj2),id(obj3)
普通模式与单例模式示例代码
result :
>>> #普通模式
... class A(object):
... def __init__(self,name,male):
... self.name = name
... self.name = male
...
>>> #实例化多个对象
... obj1 = A('ben','boy')
>>> obj2 = A('min','girl')
>>> obj3 = A('miao','boy')
>>> ##打印内存地址,可以看到内存地址都是不一样的
... print id(obj1),id(obj2),id(obj3)
140230687882448 140230687882512 140230687882576
>>>
>>> #单例模式
... class A(object):
... __instance = None
... def __init__(self,name,male):
... self.name = name
... self.name = male
... @staticmethod
... def create_obj():
... if not A.__instance:
... A.__instance = A('ben','boy')
... return A.__instance
... else:
... return A.__instance
...
>>> #单例模式实例化多个对象
... obj1 = A.create_obj()
>>> obj2 = A.create_obj()
>>> obj3 = A.create_obj()
>>> ##打印内存地址,可以看到内存地址都是一样的
... print id(obj1),id(obj2),id(obj3)
140230687882832 140230687882832 140230687882832
>>>
python之单例设计模式的更多相关文章
- python小总结3(异常、单例设计模式)
一.异常 AttributeError:试图访问一个对象没有的成员[属性和方法] ValueError:值错误,传入了一个不期望的值 ImportError:无法导入模块或者包:基本上路径问题 Ind ...
- Python中的单例设计模式
1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式. 某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...
- Python——单例设计模式
单例设计模式: 让类创建的对象,在系统中只有唯一的实例, 使用python类内置的__new__()方法实现,__new__()方法在创建对象时会被自动调用,通过重写__new__()方法,使得无论用 ...
- python学习【第十篇】单例设计模式
单例设计模式 目的:让类创建对象,在系统中只有唯一的实例,让每一次创建的对象返回的内存地址都是相同的. __new__方法 使用类名创建对象时,python解释器首先会调用__new__方法为对象分配 ...
- 基于PO和单例设计模式用python+selenium进行ui自动化框架设计
一)框架目录的结构 二)config包当中的config.ini文件主要是用来存项目的绝对路径,是为了后续跑用例和生成测试报告做准备然后目前的配置文件大都会用yaml,ini,excel,还有.py也 ...
- python基础--反射、元类、单例设计模式
反射:reflect,反射指的是一个对象应该具备可以检测.修改.增加自身属性的能力,反射就是通过字符串操作属性 hasattr(对象,带查询的属性名称) 判断某个对象中是否存在某个属性 getattr ...
- 【iOS 单例设计模式】底层解析与运用
[iOS 单例设计模式]底层解析与运用 一.单例设计名词解释: (官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.(形象比喻)程序 — 公司 单例实例 - 管理 ...
- 单例设计模式全局缓存accessToken
使用微信JS-SDK开发的小伙伴们,看文档经常会看到这样一句话:(下面是微信开发文档的一部分原话截图) 这句话就是:开发者必须在自己的服务全局缓存access_token,jsapi_ticket 下 ...
- java 单例设计模式
1.饿汉单例设计模式: 步骤 : 1.定义一个私有的静态成员变量来引用对象(私有的静态对象),设置对象唯一. 2.私有化构造方法,防止new对象. 3.创建一个公开的静态方法,返回上面的 ...
随机推荐
- Objective-c开发教程--MRC和ARC混编
iOS5.0以后就开始可以使用ARC来代替之前的MRC. 1.ARC中使用MRC的类.方法如下: 在targets的build phases选项下Compile Sources下选择要不使用arc编译 ...
- Unity截图
什么都不说了,直接上代码. using UnityEngine; using System.Collections; using System.IO; public class CutImage : ...
- Oracle学习之start with...connect by子句的用法
转自:http://www.blogjava.net/xzclog/archive/2010/03/05/314642.html,多谢博主分享 Oracle中start with…connect by ...
- phpcms-v9 --- 如何通过{pc}标签获取全站文章内容?
1.phpcms-v9默认情况下只能根据catid获取当前栏目及子栏目下的文章,但是有时候我们需要如何通过{pc}标签来获取全站文章内容的需求,应该怎么做呢? 第一步:在content_tag.cla ...
- github/python/ show me the code 25题(一)
先上网址 https://github.com/Show-Me-the-Code/show-me-the-code 初学python拿来练手,记住一些常用的库和函数 第 0000 题:将你的 QQ 头 ...
- MVC自学第四课
处理表单 前面的列子我们已经把表单提交给了HomeControllers类中的RsvpForm动作方法,只是在这个动作方法内,我们并没有做什么具体的逻辑处理,而是直接返回一个 “Thanks”的视图. ...
- 【Chromium中文文档】Profile架构(看看谷歌家的重构)
进程模型 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Profile_ ...
- 查询Oracle正在执行的sql语句
--查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, ...
- ubuntu rc.local 无效 解决方案(转)
为了让mysql开机启动,我将mysql命令添加到/etc/rc.local中,但怎么也运行不了.一开始认为只是/etc/rc.local的权限问题,但通过以下命令修改后,还是不起作用. sudo c ...
- NOI2014 Day2
NOI2014 Day2 动物园 题目描述:给出一个字符串(长度为\(Len\)),设\(num[i]\)为字符串的前\(i\)个字符构成的子串(\(A\))中,满足\(A\)的前\(L\)个字符既是 ...