python最简单单例模式_Python单例模式的4种实现方法 | 学步园
Python单例模式的4种实现方法:
方法1:
实现__new__方法,并将一个类的实例绑定到类变量_instance上。如果cls._instace为None,说明该类还未实例化过,实例化该类,并返回;如果cls._instance不为None,直接返回cls._instance
# -*- coding: utf-8 -*-
class Sington(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()
_tow.a = 3
print _one.a
print id(_one)
print id(_two)
print _one == _two
方法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 MyClass(Brog):
a = 1
one = MyClass()
two = MyClass()
two.a = 3
print one.a #3
print id(one)
print id(two)
print one == two #False
方法3:
本质上是方法1的升级版
使用__metaclass__(元素)的高级Python用法
class Singleton(type):
def __init__(cls, name, bases, dict):
super(Singleton, cls).__init__(name, bases, dict)
cls._instance = None
def __call__(cls, *args, **kw):
if cls._instance is None:
cls._instance = super(Singleton, cls).__call__(*args, **kw)
return cls._instance
class MyClass(object):
__metaclass__ = Singleton2
one = MyClass()
two = MyClass()
two.a = 3
print one.a #3
print id(one)
print id(two)
print one == two #True
方法4:
也是方法1的升级版本
使用装饰器(decorator)
这是一种更pythonic, 更elegant的方法
单例本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的
def singleton(cls, *args, **kw):
instances = {}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, *kw)
return instances[cls]
return _singleton
@singleton
class MyClass(object):
a = 1
def __init__(self, x=0):
self.x = x
one = MyClass()
two = MyClass()
two.a = 3
print one.a
print id(one)
print id(two)
print one == two
print one is two
one.x = 1
print two.x
python最简单单例模式_Python单例模式的4种实现方法 | 学步园相关推荐
- python list元素合并_python list 合并连接字符串的方法
python list 合并连接字符串的方法 更新时间:2013年03月09日 22:02:18 作者: python 列表合并字符串,我们一般会用到字符串的join方法来操作.下面通过代码的形式,详 ...
- python创建单例模式_Python单例模式的四种创建方式实例解析
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python为什么会有单例模式_python单例模式是什么意思
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 单例模式 ...
- python 实现简单画板_Python图像处理之简单画板实现方法
本文实例讲述了Python图像处理之简单画板实现方法.分享给大家供大家参考,具体如下: Python图像处理也是依赖opencv的Python接口实现的,Python语言简单易懂,简洁明了.本次实现画 ...
- python实时监控文件大小_python实现实时监控文件的方法
在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和 ...
- python可以调试吗_python调试的几种方法
第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看: # err.py def foo(s): n = int(s) print '>>> n = %d' % ...
- python加密与解密_Python字符串加密与解密的方法总结
python对字符串做加密解密处理,大致有三种方法:base64,win32com.client和自定义加密解密算法,最安全可靠的方式,建议是自写加密解密算法. 1,使用base64: 代码示例: # ...
- python中二维数组_Python二维数组实际应用方法浅析
Python数组的应用中在实际编程中是一个非常重要的应用技术,作为Python编程人员来说,必须要熟练的掌握这方面的所有应用技巧.那么,接下来,我们将会通过对Python二维数组的理解来为大家解读这方 ...
- python网站开发换行_python实现换行写代码的方法
python实现换行写代码的方法 发布时间:2020-07-02 16:34:06 来源:亿速云 阅读:257 这篇文章运用简单易懂的例子给大家介绍python实现换行写代码的方法,代码非常详细,感兴 ...
最新文章
- 第一次使用Android Studio时你应该知道的一切配置
- Java定时多线程任务实现(TimerTask)
- excel如何匹配同名数据_Excel如何查找名字重复的数据
- 洛谷 - P3389 【模板】高斯消元法(高斯消元解方程)
- JavaScript——文档对象模型
- 51单片机的轮胎气压监测系统_汽车的胎压监测系统有哪些作用?
- autobuddy in mfc导致的错误
- 新版FMEA软件结构树图 免费申请试用(FMEAHunter)
- windows优化大师怎么用_操作系统不仅有XP、win7和win10,这些更好用的系统你都用过吗...
- override overload
- 新手入门教程:关于网站建设的主要流程和步骤
- 奔跑的业绩,需要配上奔跑的Excel条形图
- 2015届互联网名企校招网址一览表
- 友盟推送_java后台集成和使用
- 没有免费午餐定理No Free Lunch Theorem
- Oracle-12:伪列rowid和rownum
- linux操作系统基础北京邮电大学出版社,Linux操作系统与实训教程
- 发现几个有趣的公众号!
- 【仿真】Carla之Traffic Manager [3]
- Python通过socket执行WOL实现局域网内网络唤醒
热门文章
- iphone清理缓存小技巧_那些不为人知的iPhone隐藏小技巧
- 被动路由跟踪工具InTrace
- iOS 9应用开发教程之iOS 9新特性
- vue树形结构html,怎么在vue中利用递归组件实现一个树形控件
- 脑电数据的Epoching处理
- 脑电分析系列[MNE-Python-9]| 参考电极应用
- 如何使用Hololens 这些手势你都要学
- IBM推出127量子比特处理器,超越谷歌和中科大
- 2000亿次开放学习后,DeepMind的智能体成精了
- 谷歌“升维打击”:还原任意角度光照立体效果,2D变“4D”!