Python单例模式 防止重复创建实例

 单例模式:无论如何实例化都是同一个实例

def singleton(cls):
    """单例模式的装饰器"""
    instances = {}

    def wrapper(*args, **kwargs):
        if cls not in instances:
            with threading.Lock():  # 线程安全
                instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper

如果是设备控制类,可通过sn等唯一标识区别实例 

class Device:

    _instances = {}  # 用于存储实例

    def __new__(cls, sn: str | None = None):
        """
        控制实例的创建,防止重复实例化
        """
        if sn is None:
            sns = device_list()
            if len(sns) == 1:
                sn = sns[0]
            elif len(sns) > 1:
                raise Exception("存在多个设备,请指定设备序列号")
            else:
                raise Exception("未检测到设备")
        if sn not in cls._instances:  # 如果不存在该实例,则创建
            instance = super().__new__(cls)  # 调用父类 __new__ 方法
            cls._instances[sn] = instance
        return cls._instances[sn]  # 返回已存在或新创建的实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值