单例设计模式
1.单例设计模式
举个常⻅的单例模式例⼦,我们⽇常使⽤的电脑上都有⼀个回收站,在整个操作系统中,回收站只能有⼀个实例,整个系统都使⽤这个唯⼀的实例,⽽且回收站⾃⾏提供⾃⼰的实例。因此回收站是单例模式的应⽤。
确保某⼀个类只有⼀个实例,⽽且⾃⾏实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是⼀种对象创建型模式。
class Singleton: __instance = None # 类属性 __is_first = True def __new__(cls, *args, **kwargs): if cls.__instance is None: # 申请内存,创建一个对象,并把对象的类型设置为cls cls.__instance = object.__new__(cls) return cls.__instance def __init__(self, a, b): if self.__is_first: self.a = a self.b = b self.__is_first = False # 调用__new__方法申请内存 # 如果不重写__new__方法,会调用object的__new__方法 # object的__new__方法会申请内存,如果重写了__new__方法,需要自己手动申请内存 s1 = Singleton('呵呵', '嘿嘿嘿') s2 = Singleton('哈哈', '嘻嘻嘻') print(s1.a, s2.a) # 呵呵 呵呵 print(s1.b, s2.b) # 嘿嘿嘿 嘿嘿嘿 print(s1 is s2) # True
2.总结
__new__
⾄少要有⼀个参数cls,代表要实例化的类,此参数在实例化时由Python解释器⾃动提供。__new__
必须要有返回值,返回实例化出来的实例,这点在⾃⼰实现__new__
时要特别注意,可以return⽗类__new__
出来的实例,或者直接是object的__new__
出来的实例。__init__
有⼀个参数self,就是这个__new__
返回的实例,__init__
在__new__
的基础上可以完成⼀些其它初始化的动作,__init__
不需要返回值。