Python笔记09-单例模式及装饰器

本文深入探讨了单例模式的两种实现方法,通过Python代码详细解释了如何创建只有一个实例的类。同时,文章对比了使用装饰器实现单例模式的优势,以及在不同场景下实例是否被覆盖的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式:

class A:
    def __new__(cls,*args,**kwargs):
        if not hasattr(cls,'instance'):# 判断对象有没有这个属性
            cls.instance = super().__new__(cls)
        return cls.instance
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def say(self):
        print(self.x)
        print(self.y)
a = A(1,2)
b = A(3,4)
a.say()

或者:

class B:
    __instance = None
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = super().__new__(cls)
        return cls.__instance
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def say(self):
        print(self.x)
        print(self.y)
c = B(6,7)
d = B(8,9)
c.say()

可以看到这两个的差别,并不是很大,但是第二个模式方便实现装饰器

def single(cls):
    _instance = {}
    def warpper(*args, **kwargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)
        return _instance[cls]
    return warpper
@single
class C:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def say(self):
        print(self.x)
        print(self.y)

要注意的是,前两种方式,后面的值时候覆盖前面的值的,但是用了装饰器后面的值是无法覆盖前面的值的。
理论上,覆盖与不覆盖都是可以设置的…下次再研究了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值