单例模式和非单类模式

单例模式:单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场. (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

 

posted @ 2021-01-21 16:18  西西cc  阅读(548)  评论(0编辑  收藏  举报