加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python singleton 4种单例

发布时间:2020-12-20 12:43:28 所属栏目:Python 来源:网络整理
导读:def singleton(cls,*args,**kwargs): instances = {} def inner(cls,**kwargs): if cls not in instances: instances[cls] = cls(*args,**kwargs) return instances[cls] return inner@singletonclass Test1: pass# 推荐使用这种 简单好用 线程安全# =======
def singleton(cls,*args,**kwargs):
    instances = {}
    def inner(cls,**kwargs):
        if cls not in instances:
            instances[cls] = cls(*args,**kwargs)
        return instances[cls]
    return inner

@singleton
class Test1:
    pass

# 推荐使用这种 简单好用 线程安全
# ===========================================================
import threading


class Singleton:
    
    def __init__(self,cls):
        self.__cls = cls
        self.__instance = None
        self._lock = threading.Lock()

    def __call__(self,**kwargs):
        self._lock.acquire()
        if self.__instance is None:
            self.__instance = self.__cls(*args,**kwargs)
        self._lock.release()
        return self.__instance
            

@Singleton
class Test2:
    pass


# 继承时的执行顺序 base new -> son new -> son init. new 相当于构造方法,init相当于实例后再初始化 先执行父类的new 就好比先是人再是学生
# ==============================================================
class SingleBase(object):
    instance = None
    
    def __new__(cls,**kwargs):

        # if not instance:
        #     instance = cls.__new__(*args,**kwargs):
        # return instance
        if cls.instance is None:
            cls.instance = object.__new__(cls)
        return cls.instance

    def __init__(self):
        pass


class Test3(SingleBase):
    
    def __init__(self,name):
        self._name = name

    def get_name(self):
        return self._name


# meta 这个我还不是很懂
# =====================================================
class MetaSingleton(type):
    _instances = {}
    def __call__(cls,**kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args,**kwargs)
        return cls._instances[cls]

class Test4(metaclass=MetaSingleton):
    
    def __init__(self):
        pass

if __name__ == '__main__':
    t1 = Test3('jwang')
    t2 = Test3('hello')
    print(id(t1))
    print(id(t2))
    print(t1.get_name())
    print(t2.get_name())

    test3 = Test4()
    test4 = Test4()
    print(id(test3) == id(test4))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读