Python单例模式

方式一:装饰器函数

def Singleton(cls):
    instance = {}

    def wrapper(*args, **kargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kargs)
        return instance[cls]

    return wrapper


@Singleton
class SingletonTest(object):
    def __init__(self, name):
        self.name = name


s1 = SingletonTest('1')
s2 = SingletonTest('2')
print(id(s1) == id(s2))

方式二:装饰器类

class Singleton(object):

    def __init__(self, cls):
        self.cls = cls
        self.instance = {}

    def __call__(self, *args, **kwargs):
        if self.cls not in self.instance:
            self.instance[self.cls] = self.cls
        return self.instance[self.cls]


@Singleton
class SingletonTest(object):
    def __init__(self, name):
        self.name = name


s1 = SingletonTest('1')
s2 = SingletonTest('2')
print(id(s1) == id(s2))

方式三:__new__

class Singleton:
    instance = {}

    def __new__(cls, *args, **kwargs):
        if cls not in cls.instance:
            cls.instance[cls] = cls

        return cls.instance[cls]

    def __init__(self, name):
        self.name = name


s1 = Singleton('1')
s2 = Singleton('2')
print(id(s1) == id(s2))

方式四:元类

class SingletonType(type):
    instance = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls.instance:
            # 方式一:
            # cls.instance[cls] = type.__call__(cls, *args, **kwargs)
            # 方式二
            # cls.instance[cls] = super(SingletonType, cls).__call__(*args, **kwargs)
            # 方式三
            cls.instance[cls] = super().__call__(*args, **kwargs)
        return cls.instance[cls]


class Singleton(metaclass=SingletonType):
    def __init__(self, name):
        self.name = name


s1 = Singleton('1')
s2 = Singleton('2')
print(id(s1) == id(s2))
posted @   阿无oxo  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示