Python Mixin 混入方式实现单例

本文探讨了使用混入方式实现单例模式的方法,并通过具体代码示例展示了其工作原理。作者创建了一个混入类,使普通类能够具备单例特性,实现在多线程环境下的唯一实例化。

 

最近学习单例以及继承,写了一个以混入方式实现单例,代码如下:


class Singleton_MiXin:
    '''混入方式继承单例,部分无效'''
    _lock = Lock()

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            with cls._lock:
                if not hasattr(cls, "_instance"):
                    cls._instance = super().__new__(cls)
        return cls._instance


if __name__ == "__main__":

    class sss:
        def __init__(self, string, age=12):
            self.name = string
            self.age = age

    class sample(sss, Singleton_MiXin):
        pass

    aa = sample('张三')
    print(aa.__dict__)
    bb = sample('李四', 28)
    print(aa is bb, id(aa), id(bb))
    print(aa.__dict__, bb.__dict__)
    print(sample.__mro__)

输出:

{'name': '张三', 'age': 12}

True 2776903597648 2776903597648

{'name': '李四', 'age': 28} {'name': '李四', 'age': 28}

(<class '__main__.sample'>, <class '__main__.sss'>, <class '__main__.Singleton_MiXin'>, <class 'object'>)

 

可以看出两个实例ID一致,is 判断为真,第二个实例创建后,第一个实例属性同步变化。

此方式在thread继承类试验有效,但QThread无效,原因不明。。

算是原创吧,随意转载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值