python3 singleton

在python 中 创单例子方法有那些了,带着好奇,今天来总结以下:

类在实例化时,首先是调用__new__方法,创建出一个实例,然后再去调用__init__ 方法对该实例进行初始化操作
第一种:

class Singleton(object):

    instance = None

    def __init__(self,*args, **kwargs):#每次都要初始化,调用多次
       pass

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super().__new__(cls, *args, **kwargs)
        return cls.instance

t1 = Singleton()
t2 = Singleton()
assert id(t1) == id(t2)
#在高并发的时候,如果都进入 if cls.instance is None: 行,单独实例就没法保证
或者:
class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,"_instance"):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

s1 = Singleton()
s2 = Singleton()

第三种

import threading
class Singleton(object):
    vars = {}
    single_lock = threading.Lock()
    def (cls, *args, **kwargs):
        if cls in cls.vars:
            return cls.vars[cls]
        cls.single_lock.acquire()
        try:
            if cls in cls.vars:
                return cls.vars[cls]
            cls.vars[cls] = super().__new__(cls, *args, **kwargs)
            return cls.vars[cls]
        finally:
            cls.single_lock.release()
t1 = Singleton()
t2 = Singleton()
assert id(t1) == id(t2)
# 利用threading lock 来实现,单在子类重载过此中,子类重新实现,不安全

第三种

#利用装饰起decorator 模式

def singleton(cls, *args, **kwargs):
    instances = {}
    def getInstance():
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return getInstance

@singleton
class Singleton(object):
    pass
t1 = Singleton()
t2 = Singleton()

第四种:

class Singleton1(type):

    _inst = {}

    def __call__(self, *args, **kw):
        if self not in self._inst:
            self._inst[self] = super(Singleton1, self).__call__(*args, **kw)
        return self._inst[self]

class MyClass1(metaclass=Singleton1):
    def __init__(self):
        self.xx = 0

    def getval(self):
        return self.xx

    def setval(self, val):
        self.xx = val

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值