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

单例模式:

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)

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

猜你喜欢

转载自blog.csdn.net/q275343119/article/details/83756884
今日推荐