Python 单例模式讲解
Python 单例模式讲解
本节内容:
- classmethod用途
- 单例模式方法一
- 类__new__方法讲解
- 单例模式方法二
前言:
使用单例方法的好处:对于一个类,多次实例化会产生多个对象,若使用单例模式,第一次实例化创建一个对象,以后在实例化就用第一次创建的对象。
1. classmethod用途
普通的类方法:
- def get_no_of_instances(cls_obj):
- return cls_obj.no_inst
- class Kls(object):
- no_inst = 0
- def __init__(self):
- Kls.no_inst = Kls.no_inst + 1
- ik1 = Kls()
- print(ik1.no_inst)
- ik2 = Kls()
- print(ik2.no_inst)
- print(get_no_of_instances(Kls))
- C:\Python35\python3.exe D:/pycharm/autoclient_cmdb/单例模式.py
- 1
- 2
- 2
静态方法:
- class Kls(object):
- no_inst = 0
- def __init__(self):
- Kls.no_inst = Kls.no_inst + 1
- @classmethod
- def get_no_of_instance(cls_obj):
- return cls_obj.no_inst
- ik1 = Kls()
- ik2 = Kls()
- print(ik1.get_no_of_instance())
- print(Kls.get_no_of_instance())
- C:\Python35\python3.exe D:/pycharm/autoclient_cmdb/单例模式.py
- 2
- 2
2.单例模式方法一
注意:这种方法需要告诉使用者,必须按照我的方法创建对象,不能直接obj = Foo()
- class Foo():
- _i = None
- @classmethod
- def instance(cls):
- if cls._i:
- return cls._i
- else:
- obj = Foo()
- cls._i = obj
- return cls._i
- #obj = Foo()
- obj = Foo.instance()
- obj1 = Foo.instance()
3.类的__new__方法讲解
类实例化时,会先执行类中的new方法,然后在执行init方法。
- class Foo(object):
- def __init__(self):
- self.n = 123
- print('执行顺序2')
- def __new__(cls, *args, **kwargs):
- o = object.__new__(cls, *args, **kwargs)
- print(o,'执行顺序1')
- return o
- obj = Foo()
- print(obj,'执行顺序3')
- C:\Python35\python3.exe D:/pycharm/autoclient_cmdb/单例模式.py
- <__main__.Foo object at 0x001B5BF0> 执行顺序1
- 执行顺序2
- <__main__.Foo object at 0x001B5BF0> 执行顺序3
4.单例模式方法二
这种方法的好处:对于使用者而言,还是正常的实例化,但是后台还是只会创建一个对象。
- class Foo(object):
- _i = None
- def __init__(self):
- self.n = 123
- print('执行顺序2')
- def __new__(cls, *args, **kwargs):
- if cls._i:
- return cls._i
- else:
- o = object.__new__(cls, *args, **kwargs)
- cls._i = o
- #print(o,'执行顺序1')
- return cls._i
- obj1 = Foo()
- obj2 = Foo()
Python 单例模式讲解的更多相关文章
- python 单例模式获取IP代理
python 单例模式获取IP代理 tags:python python单例模式 python获取ip代理 引言:最近在学习python,先说一下我学Python得原因,一个是因为它足够好用,完成同样 ...
- python单例模式的实现与优化
python单例模式的实现与优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法实现(推荐使用,方便) 5.基于me ...
- 设计模式(Python)-单例模式
本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...
- python 单例模式
单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在 用装饰器方式实现单例模式 #!/usr/bin/python # coding=utf-8 d ...
- Python单例模式
1.单例模式介绍 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时, 单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个 全局对象,这样有利于我们协调系统整体的行为 ...
- 用python语言讲解数据结构与算法
写在前面的话:关于数据结构与算法讲解的书籍很多,但是用python语言去实现的不是很多,最近有幸看到一本这样的书籍,由Brad Miller and David Ranum编写的<Problem ...
- python 单例模式的四种创建方式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python 单例模式的四种实现方法及注意事项
一.模块单例 Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码. #foo1.py clas ...
- python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解
单例:一个类只能生成唯一的一个实例 每个类只要被实例化了,他的私有属性 '_instance'就会被赋值,这样理解对吗 对 #方法1,实现__new__方法 #并在将一个类的实例绑定到类变量_inst ...
随机推荐
- 插入排序的C、C++实现
一.插入排序 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到 ...
- 消息队列1:RabbitMQ解析并基于Springboot实战
RabbitMQ简介 AMQP:Advanced Message Queue,高级消息队列协议.它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产 ...
- jquer导航锚点链接动画效果和返回顶部代码
$(function(){ $(".index_nav li a").click(function(event){ //绑定按钮的单击事件 var index = this.tit ...
- 【刷题】LOJ 6003 「网络流 24 题」魔术球
题目描述 假设有 \(n\) 根柱子,现要按下述规则在这 \(n\) 根柱子中依次放入编号为 \(1, 2, 3, 4, \cdots\) 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任 ...
- Problem A: 选举 解题报告
Problem A: 选举 题意 给出一个投票过程.有\(n\)个选民和\(m\)个候选人,每个选民\(i\)有个不重且有序的可投集合\(\{a_i\}\). 对于第一轮投票,选民\(i\)会投给\( ...
- JAVA实现概率计算(数字不同范围按照不同几率产生随机数)
程序中经常遇到随机送红包之类的情景,这个随机还得指定概率,比如10%的机率可以得到红包.那么java怎么实现一个简单的概率计算了,见如下例子: int randomInt = RandomUtils. ...
- DynamicSegmentTree
最近尝试了一下动态开点线段树,英文直译就是Dynamic Open Point Segment Tree,太SB了. 就跟之前的主席树写法差不多. if(!x || x == y) { x = ++t ...
- Linux上shell脚本date的用法
在shell脚本里date命令的用法: %% 一个文字的 % %a 当前locale 的星期名缩写(例如: 日,代表星期日) %A 当前locale 的星期名全称 (如:星期日) %b 当前local ...
- Eclipse Neon 汉化
官网下载的Eclipse是英文版的,对于初学者来说为了减小学习的难度,将英文版汉化是有必要的. 第一步:依次点击Eclipse菜单栏上的“Help"-->”About",查看 ...
- css拾遗(一)(inline-block,absolute)
一:inline-block中不要嵌套其他block标签,不然会破坏布局 <style> .left{ float:left; } .hide{ display:none; } a{ di ...