基础Python的四种单例模式实现方式

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

实现单例的几种方式

  1. 模块导入
  2. 添加装饰器(类装饰器和函数装饰器)
  3. 重写new方法
  4. 继承元类

方式一

# 方式一:
# 编写脚本my_singleton.py


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

    def do_something(self):
        pass


singleton = Singleton('模块单例')

# 在其他脚本里
# from my_singleton import singleton


方式二

# -------------------函数装饰器---------------------------
def Singleton1(cls):
    instance = {}

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

    return _singleton_wrapper


# -------------------类装饰器---------------------------
class Singleton2:

    def __init__(self, cls):
        self.cls = cls
        self._instance = None

    def __call__(self, *args, **kwargs):
        if self._instance:
            self._instance = self.cls(*args, **kwargs)
        return self._instance


# SingletonTest = Singleton1(SingletonTest) =_singleton_wrapper
# SingletonTest = Singleton2(SingletonTest) = Singleton2实例对象
@Singleton2
class SingletonTest(object):
    def __init__(self, name):
        print(">>> 初始化 <<<")
        self.name = name


s1 = SingletonTest('s1')
s2 = SingletonTest('s2')
print(id(s1), id(s2))


方式三

class Singleton(object):

    def __new__(cls, *args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            Singleton._init_flag = True
            Singleton._instance = super().__new__(cls)
        return Singleton._instance

    def __init__(self, name):
        if not hasattr(Singleton, "_init_flag"):
            print(">>> 初始化 <<<")
            self.name = name


s1 = Singleton('s1')
s2 = Singleton('s2')
print(id(s1), id(s2))

方式四

class Singleton(type):

    def __call__(cls, *args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            # cls 为 被装饰的类
            Singleton._instance = cls.__new__(cls, *args, **kwargs)
        return Singleton._instance


class SingletonTest(metaclass=Singleton):
    def __init__(self, name):
        print(">>> 初始化 <<<")
        self.name = name


s1 = SingletonTest('s1')
s2 = SingletonTest('s2')
print(id(s1), id(s2))

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python