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

    基于文件导入实现单例模式:

     db.py:

    class Foo(object):
    
        def __init__(self):
            self.conn = "连接数据库"
            pass
    
        def get(self):
            self.conn
    obj = Foo()
    
    import redis
    obj = redis.Redis(host='10.211.55.4', port=6379)
    View Code

     views.py:

    import db
    
    
    print(db.obj)
    View Code

     run.py:

    import db
    import views
    
    print(db.obj)
    View Code
    基于 classmethod : 
    import threading
    import time
    
    class Foo(object):
        instance = None
        lock = threading.Lock()
    
        def __init__(self):
            self.a1 = 1
            self.a2 = 2
            import time
            import random
            time.sleep(2)
    
        @classmethod
        def get_instance(cls,*args,**kwargs):
            if not cls.instance:
                with cls.lock:
                    if not cls.instance:
                        obj = cls(*args,**kwargs)
                        cls.instance = obj
                    return cls.instance
            return cls.instance
    def task():
        obj = Foo.get_instance()
        print(obj)
    
    import threading
    for i in range(5):
        t = threading.Thread(target=task,)
        t.start()
    
    time.sleep(10)
    Foo.get_instance()
    View Code

    基于__new__:

    import threading
    import time
    
    class Foo(object):
        instance = None
        lock = threading.Lock()
    
        def __init__(self):
            self.a1 = 1
            self.a2 = 2
            import time
            import random
            time.sleep(2)
    
        def __new__(cls, *args, **kwargs):
            if not cls.instance:
                with cls.lock:
                    if not cls.instance:
                        obj = super(Foo,cls).__new__(cls,*args, **kwargs)
                        cls.instance = obj
                    return cls.instance
            return cls.instance
    
    
    def task():
        obj = Foo()
        print(obj)
    
    import threading
    for i in range(5):
        t = threading.Thread(target=task,)
        t.start()
    View Code

    基于metaclass:

    import threading
    
    lock = threading.Lock()
    
    class Singleton(type):
        def __call__(cls, *args, **kwargs):
            if not hasattr(cls, 'instance'):
                with lock:
                    if not hasattr(cls,'instance'):
                        obj = cls.__new__(cls,*args, **kwargs)
                        obj.__init__(*args, **kwargs)
                        setattr(cls,'instance',obj)
                    return getattr(cls,'instance')
            return getattr(cls, 'instance')
    
    
    class Foo(object,metaclass=Singleton):
        def __init__(self):
            self.name = 'alex'
    
    obj1 = Foo()
    obj2 = Foo()
    
    print(obj1,obj2)
    View Code

    详细信息:https://www.cnblogs.com/huchong/p/8244279.html

      

  • 相关阅读:
    【Java学习笔记】java.lang包学习
    winform的md5加密
    地铁线路图的设计与实现
    asp.net的jQuery 表格展开伸缩
    关于批量数据更新的问题(C#高性能)
    JQuery用户名无刷新验证
    Linq分页
    用jQuery写的好的动态显示本机时间的代码
    asp.net防止页面刷新弹出“需要重新发送您以前提交的信息”
    aspx中的html代码调用CS文件中的方法
  • 原文地址:https://www.cnblogs.com/fangjie0410/p/8729265.html
Copyright © 2011-2022 走看看