zoukankan      html  css  js  c++  java
  • Python单例模式研究

    方法一

    Python代码  收藏代码
    1. import threading  
    2.   
    3. class Singleton(object):  
    4.     __instance = None  
    5.   
    6.     __lock = threading.Lock()   # used to synchronize code  
    7.   
    8.     def __init__(self):  
    9.         "disable the __init__ method"  
    10.  
    11.     @staticmethod  
    12.     def getInstance():  
    13.         if not Singleton.__instance:  
    14.             Singleton.__lock.acquire()  
    15.             if not Singleton.__instance:  
    16.                 Singleton.__instance = object.__new__(Singleton)  
    17.                 object.__init__(Singleton.__instance)  
    18.             Singleton.__lock.release()  
    19.         return Singleton.__instance  

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

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

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

     4.__lock,代码锁。

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

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

    方法二:使用decorator

    Python代码  收藏代码
    1. #encoding=utf-8  
    2. def singleton(cls):  
    3.     instances = {}  
    4.     def getInstance():  
    5.         if cls not in instances:  
    6.             instances[cls] = cls()  
    7.         return instances[cls]  
    8.     return getInstance  
    9.  
    10. @singleton  
    11. class SingletonClass:  
    12.     pass  
    13.   
    14. if __name__ == '__main__':  
    15.     s = SingletonClass()  
    16.     s2 = SingletonClass()  
    17.     print s  
    18.     print s2  

    也应该加上线程安全

    附:性能没有方法一高

    Python代码  收藏代码
    1. import threading  
    2.   
    3. class Sing(object):  
    4.     def __init__():  
    5.         "disable the __init__ method"  
    6.   
    7.     __inst = None # make it so-called private  
    8.   
    9.     __lock = threading.Lock() # used to synchronize code  
    10.  
    11.     @staticmethod  
    12.     def getInst():  
    13.         Sing.__lock.acquire()  
    14.         if not Sing.__inst:  
    15.             Sing.__inst = object.__new__(Sing)  
    16.             object.__init__(Sing.__inst)  
    17.         Sing.__lock.release()  
    18.         return Sing.__inst  
  • 相关阅读:
    YourSQLDba遭遇.NET Framework Error 6522
    ORACLE NLS_DATE_FORMAT设置
    RHEL下SendMail修改发邮箱地址
    SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析
    ORACLE归档日志比联机重做日志小很多的情况总结
    ORACLE获取SQL绑定变量值的方法总结
    ORACLE SEQUENCE跳号总结
    ORACLE中seq$表更新频繁的分析
    批量修改所有服务器的dbmail配置
    MySQL 修改账号的IP限制条件
  • 原文地址:https://www.cnblogs.com/rrxc/p/4213814.html
Copyright © 2011-2022 走看看