Python设计模式之单例模式
单例模式
module
class Singleton(object): def __init__(self): self._val = 10 @property def val(self): return self._val @val.setter def val(self, val): self._val = val singleton = Singleton()
from Singleton import singleton assert singleton.val == 10 singleton.val = 20 assert singleton.val == 20
metaclass
class Singleton(type):
def __init__(cls, what, bases, dict):
super().__init__(what, bases, dict)
cls._instance = None
def __call__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__call__(*args, **kwargs)
return cls._instance
class MyClass(metaclass=Singleton):
pass
class1 = MyClass()
class2 = MyClass()
assert class1 == class2
__new__
class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
pass
class1 = MyClass()
class2 = MyClass()
assert id(class1) == id(class2)
装饰器
def singleton(cls, *args, **kw):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class myclass:
pass
class1 = myclass()
class2 = myclass()
assert class1 == class2
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法