Python单例模式实现方法
一 简介
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
关键点:
- 某个类只能有一个实例;
- 它必须自行创建这个实例;
- 它必须自行向整个系统提供这个实例。
二 实例
1 简单方法
class Singleton:
__instance = None @classmethod
def get_instance(cls):
if cls.__instance:
return cls.__instance
cls.__instance = Singleton()
return cls.__instance obj1 = Singleton.get_instance()
print(obj1)
obj2 = Singleton.get_instance()
print(obj2)
obj3 = Singleton.get_instance()
print(obj3)
结果:
<__main__.Singleton object at 0x7f85d7044ac8>
<__main__.Singleton object at 0x7f85d7044ac8>
<__main__.Singleton object at 0x7f85d7044ac8>
2 基于简单方法的变种1
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kwargs)
return cls._instance class Foo(Singleton):
pass obj1 = Foo()
obj2 = Foo()
print(obj1)
print(obj2)
结果:
<__main__.Foo object at 0x7fed34a48c18>
<__main__.Foo object at 0x7fed34a48c18>
3 基于简单方法的变种2
class Singleton(object):
_state = {}
def __new__(cls, *args, **kwargs):
ob = super(Singleton, cls).__new__(cls, *args, **kwargs)
ob.__dict__ = cls._state
return ob class Foo(Singleton):
pass obj1 = Foo()
obj2 = Foo()
print(id(obj1.__dict__))
print(id(obj2.__dict__))
结果:
140131036531976
140131036531976
三 应用场景
由上边的实例可以看出,创建对象时,在内存中只保存一份,非常节省内存。然而,我们在什么时候会用到单例模式呢?
1. 数据库连接池
我们可以用单例模式创建一个数据库连接池,每个用户请求都可以用这个公用的数据库连接池来操作数据库。永远使用一个实例对象,从而省去了各个用户分别连接数据库时消耗的时间。
2. tornado的ioloop中的实例
Python单例模式实现方法的更多相关文章
- Python单例模式的四种方法
在这之前,先了解super()和__new__()方法 super()方法: 返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法. 它有两个典型作用: a. 在单继承的类层次结构中, ...
- python 单例模式4中实现方法
python实现单例模式的方法: 1. 使用模块 python的模块在第一次导入时会生成.pyc文件,当第二次导入时就会直接加载.pyc文件,而不会再次执行模块代码. 只需将其单独放在一个模块里,并创 ...
- Python四种实现单例模式的方法
在这之前,先了解super()和__new__()方法 super()方法: 返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法. 它有两个典型作用: a. 在单继承的类层次结构中, ...
- Python 单例模式讲解
Python 单例模式讲解 本节内容: classmethod用途 单例模式方法一 类__new__方法讲解 单例模式方法二 前言: 使用单例方法的好处:对于一个类,多次实例化会产生多个对象,若使用单 ...
- Python 面向对象 特殊方法(魔法方法)
Python 的特殊方法,两边带双下划线的方法. 比如:__init__(self, ...).__del__(self) 1.__init__(self,...) : 构造方法 __init__(s ...
- Python单例模式(Singleton)的N种实现
很多初学者喜欢用全局变量,因为这比函数的参数传来传去更容易让人理解.确实在很多场景下用全局变量很方便.不过如果代码规模增大,并且有多个文件的时候,全局变量就会变得比较混乱.你可能不知道在哪个文件中定义 ...
- python单例模式的实现与优化
python单例模式的实现与优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法实现(推荐使用,方便) 5.基于me ...
- Python测试函数的方法之一
Python测试函数的方法之一 首先介绍简单的try......except尝试运行的放例如下面的图和代码来简单介绍下: 注释:提醒以下代码环境为2.7.x 请3.x以上的同学们老规矩print(把打 ...
- 使用python原生的方法实现发送email
使用python原生的方法实现发送email import smtplib from email.mime.text import MIMEText from email.mime.multipart ...
随机推荐
- css3 属性——calc()
其实在之前学习CSS3的时候,我并没有注意到有calc()这个属性,后来在看一个大牛的代码的时候看到了这个,然后就引发了后来的一系列的查找.学习,以及这篇博客的诞生.好了,废话不多说了,来干正事. 一 ...
- virtualbox上,android x86 的分辨率的设置
参考文章: http://stackoverflow.com/questions/6202342/switch-android-x86-screen-resolution 1) 用VBoxManage ...
- Mac Hadoop2.6(CDH5.9.2)伪分布式集群安装
操作系统: MAC OS X 一.准备 1. JDK 1.8 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...
- php--------网页开发实现微信JS的(定位,地图显示,照片选择功能)
今天说说微信网页开发中一下JS的功能,分享一下,希望对各位有所帮助. 前提:要有公众号,和通过微信认证,绑定域名,得到相应信息,appid,appsecret等. 微信开发文档:https://mp. ...
- freemarker多个checkbox一个以上被选中示例
<tr> <td class="handColumn" colspan="5" > <#list deptHandNotConta ...
- HDU 4842 距离压缩DP
过河 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submissi ...
- UVA-11280 Flying to Fredericton (dijkstra)
题目大意:一张有向图,n个节点,m条边,有边权.求从起点到终点在最多经过s个中间节点(不包括始末点)时的最小权和. 题目分析:因为起点和终点是固定的,只需一次dijkstra打出表dis[u][k], ...
- Xcode6中手动添加Precompile Prefix Header
Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件,开发的过程中可以将广泛使用的头文件以及宏包含在该文件下,编译器就会 ...
- @Primary和@Qualifier这两个注解的意思(一句话概括)(二十七)
@Primary和@Qualifier这两个注解的意思: @Primary: 意思是在众多相同的bean中,优先使用用@Primary注解的bean. @Qualifier : 这个注解则指定某个b ...
- [转载]LeetCode: Gray Code
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...