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

yipeiwu_com6年前Python基础

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 

以上就是Python单例模式的实例详解,如有疑问请留言或者到本站的社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

使用python来调用CAN通讯的DLL实现方法

由于工作上的需要,经常要与USBCAN打交道,但厂家一般不会提供PYTHON的例子,于是自己摸索地写一个例子出来,以便在工作上随时可以使用PYTHON来测试CAN的功能。这里的例子是使用...

对python中Json与object转化的方法详解

对python中Json与object转化的方法详解

python提供了json包来进行json处理,json与python中数据类型对应关系如下: 一个python object无法直接与json转化,只能先将对象转化成dictiona...

实现Python与STM32通信方式

实现Python与STM32通信方式

断断续续学了几周Stm32后,突然想实现上位机和下位机的通信,恰好自己学过一点python,便想通过python实现通信. 在网上看见python库pyserial可以实现此功能,便去官...

分数霸榜! python助你微信跳一跳拿高分

前言 最近微信的跳一跳很火,大家看到排行榜上几百上千的分数,再看看自己百分左右的分数肯定很难过,我手残怪我吗?没关系,如果你跟着我来,也能让你分数霸榜。 原理 首先大家是有一个直观感受,...

Python骚操作之动态定义函数

在 Python 中,没有可以在运行时简化函数定义的语法糖。然而,这并不意味着它就不可能,或者是难以实现。 from types import FunctionType foo_c...