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 @ 2021-09-15 22:21  阿无oxo  阅读(23)  评论(0)    收藏  举报