单例模式:单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场. (selenium用的较多,防止多次创建driver对象)
非单例模式:一个类可以有多个实例 。默认是非单例模式
单例模式可以继承:如A类是单类模式,B继承A,那么B也是单例模式,如果C继承B,C依旧是单例模式。
代码实现:
Sun就是一个单例模式的类:从代码中就可以看出,创建了两次Sun()类对象,实际两次对象的内存地址值一样,证明是一个对象,第二次没有创建,直接使用第一次创建的对象。这个就是单例模式
class Sun(object): def __init__(self): self.a = 1 self.b = 2 def __new__(cls, *args, **kwargs): #单例模式--判断当前类如果有实例---就直接返回,否则创建一个再返回 if hasattr(cls,'_instance'): return cls._instance #否则创建一个再返回 cls._instance = object.__new__(cls) # 产生实例 return cls._instance if __name__ == '__main__': a1 = Sun() a2 = Sun() #id()返回对象的内存地址值 print(id(a1),id(a2)) #2568987797872 2568987797872
B不是一个单例模式的类:从代码可以看出,两次创建的B对象的内存地址值不一样,因此不是同一个对象,是两个对象
class B(): def __init__(self): self.name = 'zxb' self.age = 18 def method(self): print(self.name,self.age) if __name__ == '__main__': a1 = B() a2 = B() print(id(a1),id(a2)) #1901927132560 1901927854864
单例模式支持继承:如果Sun是单例模式,继承他的子类也就是单类模式。
有下面可以看出 A继承了Sun类,A类也是单类模式了,两次创建对象的内存地址值相等
class Sun(object): def __init__(self): self.a = 1 self.b = 2 def __new__(cls, *args, **kwargs): #单例模式--判断当前类如果有实例---就直接返回,否则创建一个再返回 if hasattr(cls,'_instance'): return cls._instance #否则创建一个再返回 cls._instance = object.__new__(cls) # 产生实例 return cls._instance class A(Sun): def __init__(self): self.name = 'zxb' self.age = 18 def method(self): print(self.name,self.age) if __name__ == '__main__': a1 = A() a2 = A() print(id(a1),id(a2)) #2175074823568 2175074823568
从下面可以看出A继承Sun,C又继承了A,C也是单例模式了。
class Sun(object): def __init__(self): self.a = 1 self.b = 2 def __new__(cls, *args, **kwargs): #单例模式--判断当前类如果有实例---就直接返回,否则创建一个再返回 if hasattr(cls,'_instance'): return cls._instance #否则创建一个再返回 cls._instance = object.__new__(cls) # 产生实例 return cls._instance class A(Sun): def __init__(self): self.name = 'zxb' self.age = 18 def method(self): print(self.name,self.age) class C(A): def __init__(self): super().__init__() if __name__ == '__main__': a1 = C() a2 = C() print(id(a1),id(a2)) #1724644453776 1724644453776