单例模式:
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)
要注意的是,前两种方式,后面的值时候覆盖前面的值的,但是用了装饰器后面的值是无法覆盖前面的值的。
理论上,覆盖与不覆盖都是可以设置的…下次再研究了。