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

    Method 1: A decorator

    def singleton(class_):
        instances = {}
        def getinstance(*args, **kwargs):
            if class_ not in instances:
                instances[class_] = class_(*args, **kwargs)
            return instances[class_]
        return getinstance
    
    @singleton
    class MyClass(BaseClass):
        pass

    Method 2: A base class

    class Singleton(object):
        _instance = None
        def __new__(class_, *args, **kwargs):
            if not isinstance(class_._instance, class_):
                class_._instance = object.__new__(class_, *args, **kwargs)
            return class_._instance
    
    class MyClass(Singleton, BaseClass):
        pass

    Method 3: A metaclass

    class Singleton(type):
        _instances = {}
        def __call__(cls, *args, **kwargs):
            if cls not in cls._instances:
                cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
            return cls._instances[cls]
    
    #Python2
    class MyClass(BaseClass):
        __metaclass__ = Singleton
    
    #Python3
    class MyClass(BaseClass, metaclass=Singleton):
        pass

    Method 4: decorator returning a class with the same name

    def singleton(class_):
        class class_w(class_):
            _instance = None
            def __new__(class_, *args, **kwargs):
                if class_w._instance is None:
                    class_w._instance = super(class_w,
                                        class_).__new__(class_,
                                                        *args,
                                                        **kwargs)
                    class_w._instance._sealed = False
                return class_w._instance
            def __init__(self, *args, **kwargs):
                if self._sealed:
                    return
                super(class_w, self).__init__(*args, **kwargs)
                self._sealed = True
        class_w.__name__ = class_.__name__
        return class_w
    
    @singleton
    class MyClass(BaseClass):
        pass

    支持多线程:

    import time
    import threading
    def singleton(class_):
    
        class class_w(class_):
            _instance_lock = threading.Lock()
            _instance = None
    
            def __new__(class_, *args, **kwargs):
                if class_w._instance is None:
                    # time.sleep(2)
                    with class_w._instance_lock:
                        if class_w._instance is None:
                            class_w._instance = super(class_w, class_).__new__(class_, *args, **kwargs)
                    class_w._instance._sealed = False
                return class_w._instance
    
            def __init__(self, *args, **kwargs):
                if self._sealed:
                    return
                super(class_w, self).__init__(*args, **kwargs)
                self._sealed = True
    
        class_w.__name__ = class_.__name__
        return class_w
    
    
    class BaseClass(object):
        pass
    
    
    @singleton
    class MyClass(BaseClass):
        pass
    
    
    if __name__ == '__main__':
        def task(arg):
            obj = MyClass()
            print(id(obj))
    
        for i in range(10):
            t = threading.Thread(target=task, args=[i, ])
            t.start()
        time.sleep(20)
        obj = MyClass()
        print(id(obj))
    
        # for i in range(100):
        #     my_obj = MyClass()
        #     print(id(my_obj))
     
  • 相关阅读:
    ios的自动转屏
    Acoustic Echo Cancellation (AEC) 回音消除技术探索
    springMVC之数据传递
    redis.conf 配置详解
    HDU 1880 字符串hash 入门题
    算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
    创建和使用SQL Server SSAS本地多维数据集
    yum局域网软件源搭建
    [置顶] 使用Android OpenGL ES 2.0绘图之六:响应触摸事件
    [置顶] Nosql笔记(一)——关系型数据库回顾
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/9234873.html
Copyright © 2011-2022 走看看