• 单例模式


    1、文件引入是一种单例模式

    2、自定义类方法(有代价,告知所有人,以后实例化时,不要再 类(),使用 类.instance() ),无法支持多线程 50分

    			class Foo(object):
    				_instance = None
    
    				def __init__(self,name):
    					self.name = name
    
    				@classmethod
    				def instance(cls,*args,**kwargs):
    					if hasattr(cls,'_instance'):
    						obj = cls(*args,**kwargs)
    						setattr(cls,'_instance,obj)
    					return cls._instance
    
    
    			obj1 = Foo.instance('alex')
    			obj2 = Foo.instance('alex')
    			print(id(obj1),id(obj2))
    

      

    3、自定义类方法(支持多线程)70分

     1 import time
     2 import threading
     3 class Singleton(object):
     4     _instance_lock = threading.Lock()
     5 
     6     def __init__(self):
     7         time.sleep(1)
     8 
     9     @classmethod
    10     def instance(cls, *args, **kwargs):
    11         if not hasattr(Singleton, "_instance"):
    12             with Singleton._instance_lock:
    13                 if not hasattr(Singleton, "_instance"):
    14                     Singleton._instance = Singleton(*args, **kwargs)
    15         return Singleton._instance
    16 
    17 
    18 def task(arg):
    19     obj = Singleton.instance()
    20     print(obj)
    21 for i in range(10):
    22     t = threading.Thread(target=task,args=[i,])
    23     t.start()
    24 time.sleep(20)
    25 obj = Singleton.instance()
    26 print(obj)
    View Code

    4、基于__new__方法实现单例模式 80分(对于用户更友好,和普通实例化一样)

    # class Singleton(object):
    #     def __init__(self):
    #         print('init',self)
    #
    #
    #     def __new__(cls, *args, **kwargs):
    #         o = object.__new__(cls, *args, **kwargs)
    #         print('new',o)
    #         return o
    #
    # obj = Singleton()
    #
    # print('xxx',obj)
    
    #先执行__new__方法,创建对象,再执行__init__方法,再赋值给obj,他们三个打印的对象是一样的。
    提前准备
    import time
    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, *args, **kwargs)
            return Singleton._instance
    
    obj1 = Singleton()
    obj2 = Singleton()
    print(obj1,obj2)
    实现

     5、基于metaclass方式实现

    """
    1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法
    2.类是type创建,创建类时候type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)
    
    # 第0步: 执行type的 __init__ 方法【类是type的对象】
    class Foo:
        def __init__(self):
            pass
    
        def __call__(self, *args, **kwargs):
            pass
    
    # 第1步: 执行type的 __call__ 方法
    #        1.1  调用 Foo类(是type的对象)的 __new__方法,用于创建对象。
    #        1.2  调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。
    obj = Foo()
    # 第2步:执行Foo的 __call__ 方法
    obj()
    """
    
    
    """
    class SingletonType(type):
        def __init__(self,*args,**kwargs):
            super(SingletonType,self).__init__(*args,**kwargs)
    
        def __call__(cls, *args, **kwargs):
            obj = cls.__new__(cls,*args, **kwargs)
            cls.__init__(obj,*args, **kwargs) # Foo.__init__(obj)
            return obj
    
    class Foo(metaclass=SingletonType):
        def __init__(self,name):
            self.name = name
        def __new__(cls, *args, **kwargs):
            return object.__new__(cls, *args, **kwargs)
    
    obj = Foo('name')
    """
    提前准备

    执行顺序:

    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)
    实现
  • 相关阅读:
    CF Round433 B. Jury Meeting
    CF Round433 C. Planning
    繁忙的都市
    联络员
    组合数模板
    Rinne Loves Xor
    [SDOI2016]齿轮
    水题(water)
    Music Problem
    小H和游戏
  • 原文地址:https://www.cnblogs.com/wangbaihan/p/8068083.html
Copyright © 2020-2023  润新知