zoukankan      html  css  js  c++  java
  • python 单例模式总结

    参考

    # 第一种方法 new 方法
    class Singleton(object):
        def __new__(cls,*args,**kw):
            if not hasattr(cls,'_instance'):
                cls._instance = super(Singleton,cls).__new__(cls,*args,**kw)
            return cls._instance
        
    s1 = Singleton()
    s2 = Singleton()
    s1 == s2
    
    # 第二种方法升级为元类 call 控制,实质跟方法一差不多
    class SingletonMetaclass(type):    
        def __call__(cls,*args,**kw):
            if not hasattr(cls,'_instance'):
                cls._instance = super(SingletonMetaclass,cls).__call__(*args,**kw)
    #         cls.__init__(cls._instance,*args,**kw)
            return cls._instance
            
    class Singleton(object,metaclass=SingletonMetaclass):
        pass
        
    s1 = Singleton()
    s2 = Singleton()
    s1 == s2
    
    # 第三种,使用装饰器
    def singleton(cls,*args,**kw):
        instance = {}
        def get_instance():
            if cls not in instance:
                instance[cls] = cls.__new__(cls,*args,**kw)
            return instance[cls]
        return get_instance
    
    @singleton
    class Singleton(object):
        pass
    
    s1 = Singleton()
    s2 = Singleton()
    s1 == s2
    

    线程安全

    # 线程安全的 写法
    # 装饰器
    import threading
    def Singleton(cls,*args,**kw):
        instance = {}
        _instance_lock = threading.Lock()
        def get_instance():
            if cls not in instance:
                with _instance_lock:
                    if cls not in instance:
                        instance[cls] = cls.__new__(cls,*args,**kw)
                        cls.__init__(instance[cls],*args,**kw)
            return instance[cls]
        return get_instance
    
    @Singleton
    class Demo(object):
        pass
    d1 = Demo()
    d2 = Demo()
    d1 is d2
    
    # 基类
    class Singleton(object):
        def __new__(cls,*args,**kw):
            if not hasattr(cls,'_instance'):
                    cls._instance = super(Singleton,cls).__new__(cls,*args,**kw)
            return cls._instance
        
    s1 = Singleton()
    s2 = Singleton()
    print(s1 == s2)
    
    # 升级为元类
    import threading
    class SingletonMetaclass(type):
        def __call__(cls,*args,**kw):
            _instance_lock = threading.Lock()
            if not hasattr(cls,'_instance'):
                with _instance_lock:
                    if not hasattr(cls,'_instance'):
                        cls._instance = cls.__new__(cls,*args,**kw)
                        cls.__init__(cls._instance,*args,**kw)
            return cls._instance
        
    class Demo(object,metaclass=SingletonMetaclass):
        pass
    
    d2 = Demo()
    d3 = Demo()
    d2 is d3
    
    mysingleton.py
    
    class Singleton(object):
        def foo(self):
            pass
    singleton = Singleton()
    将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象
    
    from mysingleton import singleton
    
    方法四:Borg模式
    利用“类变量对所有对象唯一”,即__share_state
    
    class Foo:
       __share_state = {}
       def __init__(self):
           self.__dict__ = self.__share_state
    
    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    mysql 系列文章推荐
    文章推荐
    LeetCode 229: Majority Element II
    archlinux安装ssh,并启动服务 | 繁华的森林
    小程序之登录
    owasp top10
    JAVASE学习笔记—009 异常处理
    Spring学习笔记:Bean的配置及其细节
    Vim编码识别及转换
    理解 Java 中的类装载器
  • 原文地址:https://www.cnblogs.com/Frank99/p/9356095.html
Copyright © 2011-2022 走看看