Python单例模式的两种实现方法

作者:lqh 时间:2023-03-03 12:31:09 

Python单例模式的两种实现方法

方法一 


import threading

class Singleton(object):
 __instance = None

__lock = threading.Lock()  # used to synchronize code

def __init__(self):
   "disable the __init__ method"

@staticmethod
 def getInstance():
   if not Singleton.__instance:
     Singleton.__lock.acquire()
     if not Singleton.__instance:
       Singleton.__instance = object.__new__(Singleton)
       object.__init__(Singleton.__instance)
     Singleton.__lock.release()
   return Singleton.__instance

 1.禁用__init__方法,不能直接创建对象。

 2.__instance,单例对象私有化。

 3.@staticmethod,静态方法,通过类名直接调用。

 4.__lock,代码锁。

 5.继承object类,通过调用object的__new__方法创建单例对象,然后调用object的__init__方法完整初始化。 

6.双重检查加锁,既可实现线程安全,又使性能不受很大影响。 

方法二:使用decorator


#encoding=utf-8
def singleton(cls):
 instances = {}
 def getInstance():
   if cls not in instances:
     instances[cls] = cls()
   return instances[cls]
 return getInstance

@singleton
class SingletonClass:
 pass

if __name__ == '__main__':
 s = SingletonClass()
 s2 = SingletonClass()
 print s
 print s2

也应该加上线程安全  

附:性能没有方法一高


import threading

class Sing(object):
 def __init__():
   "disable the __init__ method"

__inst = None # make it so-called private

__lock = threading.Lock() # used to synchronize code

@staticmethod
 def getInst():
   Sing.__lock.acquire()
   if not Sing.__inst:
     Sing.__inst = object.__new__(Sing)
     object.__init__(Sing.__inst)
   Sing.__lock.release()
   return Sing.__inst

来源:http://huaxia524151.iteye.com/blog/1345156

标签:Python,单例模式
0
投稿

猜你喜欢

  • Django实战之用户认证(初始配置)

    2022-08-17 22:15:02
  • PHP程序员最常犯的11个MySQL错误

    2012-01-05 19:13:02
  • MySQL索引数据结构入门详细教程

    2024-01-25 02:02:42
  • 段正淳的css笔记(2)圆角的做法

    2007-11-01 21:52:00
  • PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式

    2024-04-10 10:56:49
  • PHP连接MySQL数据的操作要点

    2023-06-20 09:31:16
  • Python如何使用opencv进行手势识别详解

    2021-11-06 07:12:23
  • python 读取.csv文件数据到数组(矩阵)的实例讲解

    2023-08-10 12:12:36
  • 一篇文章带你搞懂Go语言标准库Time

    2024-05-09 09:54:35
  • Python matplotlib画图实例之绘制拥有彩条的图表

    2023-01-26 02:06:25
  • Python源码学习之PyType_Type和PyBaseObject_Type详解

    2023-08-03 15:50:05
  • python使用QQ邮箱实现自动发送邮件

    2021-03-03 22:10:06
  • python 用所有标点符号分隔句子的示例

    2022-09-18 01:41:57
  • Pycharm 文件更改目录后,执行路径未更新的解决方法

    2023-06-17 03:33:48
  • python机器学习pytorch 张量基础教程

    2023-06-18 04:54:31
  • Python curses内置颜色用法实例

    2021-07-27 02:41:35
  • django 通过URL访问上传的文件方法

    2022-09-02 22:03:59
  • asp如何计算下载一个文件需要多长时间?

    2009-11-25 20:17:00
  • 一篇文章带你自学python Django

    2023-11-13 20:33:13
  • Oracle to_char函数的使用方法

    2024-01-19 01:47:37
  • asp之家 网络编程 m.aspxhome.com