python --单例实现
- def singleton(cls):
- _instance = {}
-
- def inner():
- if cls not in _instance:
- _instance[cls] = cls()
- return _instance[cls]
- return inner
-
- @singleton
- class Cls(object):
- def __init__(self):
- pass
-
- cls1 = Cls()
- cls2 = Cls()
- print(id(cls1) == id(cls2))
-
- class Singleton(object):
- def __init__(self, cls):
- self._cls = cls
- self._instance = {}
-
- def __call__(self):
- if self._cls not in self._instance:
- self._instance[self._cls] = self._cls()
- return self._instance[self._cls]
-
-
- @Singleton
- class Cls2(object):
- def __init__(self):
- pass
-
-
- cls1 = Cls2()
- cls2 = Cls2()
- print(id(cls1) == id(cls2))
-
同时,由于是面对对象的,这里还可以这么用
- class Cls3():
- pass
-
- Cls3 = Singleton(Cls3)
- cls3 = Cls3()
- cls4 = Cls3()
- print(id(cls3) == id(cls4))
-
- class Single(object):
- _instance = None
- def __new__(cls, *args, **kw):
- if cls._instance is None:
- cls._instance = object.__new__(cls, *args, **kw)
- return cls._instance
- def __init__(self):
- pass
-
- single1 = Single()
- single2 = Single()
- print(id(single1) == id(single2))
-
- 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]
-
-
- class Cls4(metaclass=Singleton):
- pass
-
-
- cls1 = Cls4()
- cls2 = Cls4()
- print(id(cls1) == id(cls2))
-
- 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()
- print(obj)
-
这种方式实现的单例模式,使用时会有限制,以后实例化必须通过 obj = Singleton.instance()
如果用 obj=Singleton() ,这种方式得到的不是单例
- 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
-
-
- obj1 = Singleton()
- obj2 = Singleton()
- print(obj1, obj2)
-
-
- def task(arg):
- obj = Singleton()
- print(obj)
-
-
- for i in range(10):
- t = threading.Thread(target=task, args=[i, ])
- t.start()
-
- 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)
-
- class Singleton(object):
-
- def __new__(cls, *args, **kwargs):
- if not hasattr(cls, '_instance'):
- orig = super(Singleton, cls)
- cls._instance = orig.__new__(cls, *args, **kwargs)
- return cls._instance
-
- class MyClass(Singleton):
- a = 1
-
- one = MyClass()
- two = MyClass()
-
- #one和two完全相同,可以用id(), ==, is检测
- print id(one) # 29097904
- print id(two) # 29097904
- print one == two # True
- print one is two # True
-
- class Singleton2(type):
-
- def __init__(cls, name, bases, dict):
- super(Singleton2, cls).__init__(name, bases, dict)
- cls._instance = None
-
- def __call__(cls, *args, **kwargs):
- if cls._instance is None:
- cls._instance = super(Singleton2, cls).__call__(*args, **kwargs)
- return cls._instance
-
- class MyClass2(object):
- __metaclass__ = Singleton2
- a = 1
-
- one = MyClass2()
- two = MyClass2()
-
- print id(one) # 31495472
- print id(two) # 31495472
- print one == two # True
- print one is two # True
-