• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

jwang106


脚踏实地,日拱一卒。 建立新的神经链接,可不像公园散步那样简单。
  • 博客园
  • 联系
  • 管理

View Post

python singleton 4种单例

def singleton(cls, *args, **kwargs):
    instances = {}
    def inner(cls, *args, **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, *args, **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, *args, **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, *args, **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))

posted on 2019-08-09 20:36  jwang106  阅读(203)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3