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种实现方法 | 学步园相关推荐

  1. python list元素合并_python list 合并连接字符串的方法

    python list 合并连接字符串的方法 更新时间:2013年03月09日 22:02:18 作者: python 列表合并字符串,我们一般会用到字符串的join方法来操作.下面通过代码的形式,详 ...

  2. python创建单例模式_Python单例模式的四种创建方式实例解析

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  3. python为什么会有单例模式_python单例模式是什么意思

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 单例模式 ...

  4. python 实现简单画板_Python图像处理之简单画板实现方法

    本文实例讲述了Python图像处理之简单画板实现方法.分享给大家供大家参考,具体如下: Python图像处理也是依赖opencv的Python接口实现的,Python语言简单易懂,简洁明了.本次实现画 ...

  5. python实时监控文件大小_python实现实时监控文件的方法

    在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和 ...

  6. python可以调试吗_python调试的几种方法

    第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看: # err.py def foo(s): n = int(s) print '>>> n = %d' % ...

  7. python加密与解密_Python字符串加密与解密的方法总结

    python对字符串做加密解密处理,大致有三种方法:base64,win32com.client和自定义加密解密算法,最安全可靠的方式,建议是自写加密解密算法. 1,使用base64: 代码示例: # ...

  8. python中二维数组_Python二维数组实际应用方法浅析

    Python数组的应用中在实际编程中是一个非常重要的应用技术,作为Python编程人员来说,必须要熟练的掌握这方面的所有应用技巧.那么,接下来,我们将会通过对Python二维数组的理解来为大家解读这方 ...

  9. python网站开发换行_python实现换行写代码的方法

    python实现换行写代码的方法 发布时间:2020-07-02 16:34:06 来源:亿速云 阅读:257 这篇文章运用简单易懂的例子给大家介绍python实现换行写代码的方法,代码非常详细,感兴 ...

最新文章

  1. 第一次使用Android Studio时你应该知道的一切配置
  2. Java定时多线程任务实现(TimerTask)
  3. excel如何匹配同名数据_Excel如何查找名字重复的数据
  4. 洛谷 - P3389 【模板】高斯消元法(高斯消元解方程)
  5. JavaScript——文档对象模型
  6. 51单片机的轮胎气压监测系统_汽车的胎压监测系统有哪些作用?
  7. autobuddy in mfc导致的错误
  8. 新版FMEA软件结构树图 免费申请试用(FMEAHunter)
  9. windows优化大师怎么用_操作系统不仅有XP、win7和win10,这些更好用的系统你都用过吗...
  10. override overload
  11. 新手入门教程:关于网站建设的主要流程和步骤
  12. 奔跑的业绩,需要配上奔跑的Excel条形图
  13. 2015届互联网名企校招网址一览表
  14. 友盟推送_java后台集成和使用
  15. 没有免费午餐定理No Free Lunch Theorem
  16. Oracle-12:伪列rowid和rownum
  17. linux操作系统基础北京邮电大学出版社,Linux操作系统与实训教程
  18. 发现几个有趣的公众号!
  19. 【仿真】Carla之Traffic Manager [3]
  20. Python通过socket执行WOL实现局域网内网络唤醒

热门文章

  1. iphone清理缓存小技巧_那些不为人知的iPhone隐藏小技巧
  2. 被动路由跟踪工具InTrace
  3. iOS 9应用开发教程之iOS 9新特性
  4. vue树形结构html,怎么在vue中利用递归组件实现一个树形控件
  5. 脑电数据的Epoching处理
  6. 脑电分析系列[MNE-Python-9]| 参考电极应用
  7. 如何使用Hololens 这些手势你都要学
  8. IBM推出127量子比特处理器,超越谷歌和中科大
  9. 2000亿次开放学习后,DeepMind的智能体成精了
  10. 谷歌“升维打击”:还原任意角度光照立体效果,2D变“4D”!