Python单例模式的4种实现方法
- #-*- encoding=utf-8 -*-
- print '----------------------方法1--------------------------'
- #方法1,实现__new__方法
- #并在将一个类的实例绑定到类变量_instance上,
- #如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
- #如果cls._instance不为None,直接返回cls._instance
- class Singleton(object):
- def __new__(cls, *args, **kw):
- if not hasattr(cls, '_instance'):
- orig = super(Singleton, cls)
- cls._instance = orig.__new__(cls, *args, **kw)
- return cls._instance
- class MyClass(Singleton):
- a = 1
- one = MyClass()
- two = MyClass()
- two.a = 3
- print one.a
- #3
- #one和two完全相同,可以用id(), ==, is检测
- print id(one)
- #29097904
- print id(two)
- #29097904
- print one == two
- #True
- print one is two
- #True
- print '----------------------方法2--------------------------'
- #方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)
- #同一个类的所有实例天然拥有相同的行为(方法),
- #只需要保证同一个类的所有实例具有相同的状态(属性)即可
- #所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)
- #可参看:http://code.activestate.com/recipes/66531/
- class Borg(object):
- _state = {}
- def __new__(cls, *args, **kw):
- ob = super(Borg, cls).__new__(cls, *args, **kw)
- ob.__dict__ = cls._state
- return ob
- class MyClass2(Borg):
- a = 1
- one = MyClass2()
- two = MyClass2()
- #one和two是两个不同的对象,id, ==, is对比结果可看出
- two.a = 3
- print one.a
- #3
- print id(one)
- #28873680
- print id(two)
- #28873712
- print one == two
- #False
- print one is two
- #False
- #但是one和two具有相同的(同一个__dict__属性),见:
- print id(one.__dict__)
- #30104000
- print id(two.__dict__)
- #30104000
- print '----------------------方法3--------------------------'
- #方法3:本质上是方法1的升级(或者说高级)版
- #使用__metaclass__(元类)的高级python用法
- class Singleton2(type):
- def __init__(cls, name, bases, dict):
- super(Singleton2, cls).__init__(name, bases, dict)
- cls._instance = None
- def __call__(cls, *args, **kw):
- if cls._instance is None:
- cls._instance = super(Singleton2, cls).__call__(*args, **kw)
- return cls._instance
- class MyClass3(object):
- __metaclass__ = Singleton2
- one = MyClass3()
- two = MyClass3()
- two.a = 3
- print one.a
- #3
- print id(one)
- #31495472
- print id(two)
- #31495472
- print one == two
- #True
- print one is two
- #True
- print '----------------------方法4--------------------------'
- #方法4:也是方法1的升级(高级)版本,
- #使用装饰器(decorator),
- #这是一种更pythonic,更elegant的方法,
- #单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的
- def singleton(cls):
- instances = {}
- def _singleton(, *args, **kw):
- if cls not in instances:
- instances[cls] = cls(*args, **kw)
- return instances[cls]
- return _singleton
- @singleton
- class MyClass4(object):
- a = 1
- def __init__(self, x=0):
- self.x = x
- one = MyClass4()
- two = MyClass4()
- two.a = 3
- print one.a
- #3
- print id(one)
- #29660784
- print id(two)
- #29660784
- print one == two
- #True
- print one is two
- #True
- one.x = 1
- print one.x
- #1
- print two.x
- #1
Python单例模式的4种实现方法的更多相关文章
- python单例模式的几种实现方法
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python 单例模式的四种实现方法及注意事项
一.模块单例 Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码. #foo1.py clas ...
- Python 单例模式的几种实现方式
单例模式的几种实现方式 先来看几个魔法方法的简单运用:__new__, __init__, __call__. class A(object): def __init__(self, x): prin ...
- Python队列的三种队列方法
今天讲一下队列,用到一个python自带的库,queue 队列的三种方法有: 1.FIFO先入先出队列(Queue) 2.LIFO后入先出队列(LifoQueue) 3.优先级队列(PriorityQ ...
- Python单例模式的四种方法
在这之前,先了解super()和__new__()方法 super()方法: 返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法. 它有两个典型作用: a. 在单继承的类层次结构中, ...
- python 单例模式的四种创建方式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python之asyncio三种应用方法
1.直接使用asyncio.run方法2.同步的效果,用await调用函数3.创建任务(asyncio.create_task),并发运行任务(await asyncio.gather) import ...
- Python 单例模式(3种方式)
方式一: # 单例模式: # 实现目的:实例化多次,得到的实例是同一个,就是同一个对象,同一个名称空间(更加节省空间) ####################################方式一: ...
- Python 模拟登录几种常见方法
方法一:直接使用已知的cookie访问 优点: 简单,但需要先在浏览器登录 原理: 简单地说,cookie保存在发起请求的客户端中,服务器利用cookie来区分不同的客户端.因为http是一种无状态的 ...
随机推荐
- GSM中时隙、信道、突发序列、帧的解释
刚从论坛中看到有人问GSM中时隙.信道.突发序列.帧知识.今天我们数字通信正好上到这一块,我就根据我知道的和网上搜索的回答! 1.时分多路复用技术 FDMA:频分多址 TDMA:时分多址 CDMA:码 ...
- chrome flash插件地址
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\PepperFlash 火狐
- node-webkit 入门
下载node-webkit 点击这里: https://github.com/rogerwang/node-webkit 找到Downloads这一小节,然后下载对应平台的node-webkit预编译 ...
- Netty网络聊天室之会话管理
写过web的同学们应该对Session这个东西很熟悉.浏览器第一次与服务器建立连接的时候,服务器就会自动为之分配一个Session.Session可以用来判断用户是否经过登录验证,也可以保存用户的各种 ...
- Foundation--NSString , array and Dictionary
一,NSString的创建 NSString*str=@" a string ";//直接创建一个字符串常量,这样创建出来的字符串不需要释放内存 NSLog(@"%@&q ...
- PHP文件上传大小设置
PHP.INI配置:文件上传功能配置教程 打开php.ini配置文件中的upload_tmp_dir.upload_max_filesize.post_max_size等选项. php.ini中文件上 ...
- css3 制作平滑过度动画
-webkit-transition(属性渐变) -webkit-transition:CSS属性(none|all|属性) 持续时间 时间函数 延迟时间 CSS属性(transition-pr ...
- Error: timed out while waiting for target halted
/************************************************************************************ * Error: timed ...
- Ubuntu install TensorFlow
/******************************************************************************** * Ubuntu install T ...
- SendTo MD5 - imsoft.cnblogs
SendTo MD5 is a small application that allows you to calculate and compare MD5 checksums of files an ...