2025年4月9日 星期三 乙巳(蛇)年 正月初十 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

python --单例实现

时间:08-16来源:作者:点击数:27
城东书院 www.cdsy.xyz

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))

使用 new 关键字实现单例模式

  • 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))

使用 metaclass 实现单例模式

  • 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() ,这种方式得到的不是单例

new方法(多线程)

  • 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)

new(另一种写法)

  • 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
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐