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

    一. 单例模式四种方式

    用于mysql连接时,防止每次操作都去创建一个数据库连接,使用单例模式仅在第一次创建连接,以后均使用该连接即可。

    1. 文件导入

    2. 基于类

    无法支持多线程

    import threading
    
    class Singleton(object): 
        def __init__(self):
            pass
        @classmethod 
        def instance(cls, *args, **kwargs): 
            if not hasattr(Singleton, "_instance"): 
                Singleton._instance = Singleton(*args, **kwargs) 
        return Singleton._instance
        
    obj = Singleton.instance()
    View Code

    支持多线程

    import time
    import threading
    class Singleton(object):
        _instance_lock = threading.Lock()
    
        def __init__(self):
            time.sleep(1)
    
        @classmethod
        def instance(cls, *args, **kwargs):
            if not hasattr(Singleton, "_instance"):
                with Singleton._instance_lock:
                    if not hasattr(Singleton, "_instance"):
                        Singleton._instance = Singleton(*args, **kwargs)
            return Singleton._instance
    
    
    # 第一次调用
    def task(arg):
        obj = Singleton.instance()
        print(obj)
    for i in range(10):
        t = threading.Thread(target=task,args=[i,])
        t.start()
    
    
    # 第二次调用    
    time.sleep(20)
    obj = Singleton.instance()
    View Code

    3. 使用__new__

    无法支持多线程

    class Singleton(object):
    
        def __init__(self,name):
            self.name = name
            
    
        def __new__(cls, *args, **kwargs):
    
            if not hasattr(Singleton, "instance"):
                Singleton.instance = object.__new__(cls)
            return Singleton.instance
    
    
    obj = Singleton("alex")
    obj1 = Singleton("alex")
    obj2 = Singleton("alex")
    View Code

    支持多线程

    import threading
    
    class Singleton(object):
        instance_lock = threading.Lock()
    
        def __init__(self):
            pass
    
    
        def __new__(cls, *args, **kwargs):
            if not hasattr(Singleton, "instance"):
                with Singleton.instance_lock:
                    if not hasattr(Singleton, "instance"):
                        Singleton.instance = object.__new__(cls)
                    return Singleton.instance
            return Singleton.instance
    
    def task():
        obj = Singleton()
        print(obj)
    
    for i in range(5):
        t = threading.Thread(target=task)
        t.start()
    View Code

    4. 基于metaclass

    -------------------------------(一)-------------------------------
    
    # 创建对象
    
    class SingletonType(type):
    
        def __call__(cls, *args, **kwargs):
            obj = super(SingletonType,cls).__call__(*args, **kwargs)   #type类帮创建__new__和__init__并返回
            return obj
    
    class Foo(metaclass=SingletonType):
        def __init__(self,name):
            self.name = name
    
    obj = Foo("alex")
    
    -------------------------------(二)-------------------------------
    
    import threading
    
    class SingletonType(type):
        
        _instance_lock = threading.Lock()
        
        def __call__(cls, *args, **kwargs):
            if not hasattr(cls, "_instance"):
                with SingletonType._instance_lock:
                    if not hasattr(cls, "_instance"):
                        cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
            return cls._instance
    
    class Foo(metaclass=SingletonType):
        def __init__(self,name):
            self.name = name
    
    
    obj1 = Foo('name')
    obj2 = Foo('name')
    print(obj1,obj2)
    View Code
  • 相关阅读:
    制作一个漂亮的表格
    模版语言
    Django 学习
    linux系统服务名称
    CentOS下netstat + awk 查看tcp的网络连接状态
    Python的MySQLdb模块安装
    shellinabox安装
    堡垒机 paramiko 自动登陆代码
    堡垒机 paramiko代码
    Paramiko 模块使用
  • 原文地址:https://www.cnblogs.com/golangav/p/8250873.html
Copyright © 2011-2022 走看看