[Python] Singleton

Singleton

Singleton pattern is a creational design patterns. Singleton pattern class initialization only once, and only one instance of the object to provide, multiple calls to the same class object id resulting
multi applied to logs, configuration, etc.

The method of embodiment achieve single mode python

  • Decorator
	def single(cls):
	    def singleton(*args, **kwargs):
	        if not hasattr(cls, '_instance'):
	            cls._instance = cls(*args, **kwargs)
	        return cls._instance
	    return singleton
	
	@single
	class Foo(object):
	    def __init__(self, a=0, b=0):
	        print('init=', a + b)
	        pass
	f1 = Foo(1, 2)
	f2 = Foo(3, 4)
	#
	print(f1)
	print(f2)
	print(id(f1))
	print(id(f2))
	
	print(f1 == f2)
	init= 3
	<__main__.Foo object at 0x000000000297AA20>
	<__main__.Foo object at 0x000000000297AA20>
	43493920
	43493920
	True
	False
	True
	import threading
	class Singleton(type):
	    lock = threading.Lock()
	    def __call__(cls, *args, **kwargs):
	        with Singleton.lock:
	            if not hasattr(cls, '_instance'):
	                cls._instance = super().__call__(*args, **kwargs)
	        return cls._instance
	
	
	class Foo(metaclass=Singleton):
	    def __init__(self, a=0, b=0):
	        print(a + b)
	        pass
	f1 = Foo(1, 2)
	f2 = Foo(3, 4)
	#
	print(f1)
	print(f2)
	print(id(f1))
	print(id(f2))
	
	print(f1 == f2)	        
	3
	<__main__.Foo object at 0x000000000291EFD0>
	<__main__.Foo object at 0x000000000291EFD0>
	43118544
	43118544
	True
  • __New__ modification method
	class Foo(object):
	    def __new__(cls, *args, **kwargs):
	        if not hasattr(cls, '_instance'):
	            cls._instance = super().__new__(cls)
	        return cls._instance
	
	    def __init__(self, a=0, b=0):
	        print('init=', a + b)
	        pass
	
	f1 = Foo(1, 2)
	f2 = Foo(3, 4)
	print(f1)
	print(f2)
	print(id(f1))
	print(id(f2))
	
	print(f1 == f2)
	init= 3
	init= 7
	<__main__.Foo object at 0x000000000292E710>
	<__main__.Foo object at 0x000000000292E710>
	43181840
	43181840
	True
	False
	True

Guess you like

Origin blog.csdn.net/weixin_39974140/article/details/89522062