python 单例模式总结

参考

# 第一种方法 new 方法
class Singleton(object):
    def __new__(cls,*args,**kw):
        if not hasattr(cls,'_instance'):
            cls._instance = super(Singleton,cls).__new__(cls,*args,**kw)
        return cls._instance
    
s1 = Singleton()
s2 = Singleton()
s1 == s2
# 第二种方法升级为元类 call 控制,实质跟方法一差不多
class SingletonMetaclass(type):    
    def __call__(cls,*args,**kw):
        if not hasattr(cls,'_instance'):
            cls._instance = super(SingletonMetaclass,cls).__call__(*args,**kw)
#         cls.__init__(cls._instance,*args,**kw)
        return cls._instance
        
class Singleton(object,metaclass=SingletonMetaclass):
    pass
    
s1 = Singleton()
s2 = Singleton()
s1 == s2
# 第三种,使用装饰器
def singleton(cls,*args,**kw):
    instance = {}
    def get_instance():
        if cls not in instance:
            instance[cls] = cls.__new__(cls,*args,**kw)
        return instance[cls]
    return get_instance

@singleton
class Singleton(object):
    pass

s1 = Singleton()
s2 = Singleton()
s1 == s2

线程安全

# 线程安全的 写法
# 装饰器
import threading
def Singleton(cls,*args,**kw):
    instance = {}
    _instance_lock = threading.Lock()
    def get_instance():
        if cls not in instance:
            with _instance_lock:
                if cls not in instance:
                    instance[cls] = cls.__new__(cls,*args,**kw)
                    cls.__init__(instance[cls],*args,**kw)
        return instance[cls]
    return get_instance

@Singleton
class Demo(object):
    pass
d1 = Demo()
d2 = Demo()
d1 is d2
# 基类
class Singleton(object):
    def __new__(cls,*args,**kw):
        if not hasattr(cls,'_instance'):
                cls._instance = super(Singleton,cls).__new__(cls,*args,**kw)
        return cls._instance
    
s1 = Singleton()
s2 = Singleton()
print(s1 == s2)
# 升级为元类
import threading
class SingletonMetaclass(type):
    def __call__(cls,*args,**kw):
        _instance_lock = threading.Lock()
        if not hasattr(cls,'_instance'):
            with _instance_lock:
                if not hasattr(cls,'_instance'):
                    cls._instance = cls.__new__(cls,*args,**kw)
                    cls.__init__(cls._instance,*args,**kw)
        return cls._instance
    
class Demo(object,metaclass=SingletonMetaclass):
    pass

d2 = Demo()
d3 = Demo()
d2 is d3
mysingleton.py

class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()
将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象

from mysingleton import singleton
方法四:Borg模式
利用“类变量对所有对象唯一”,即__share_state

class Foo:
   __share_state = {}
   def __init__(self):
       self.__dict__ = self.__share_state

转载于:https://www.cnblogs.com/Frank99/p/9356095.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值