• 单例模式和非单类模式


    单例模式:单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场. (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
  • 相关阅读:
    HeadFirst Ruby 第七章总结 references
    《HTTP 权威指南》笔记:第三章 HTTP 报文
    HTTP 权威指南 第二章 URL 与资源
    HeadFIrst Ruby 第七章总结 hashes
    HeadFIrst Ruby 第六章总结 block return values
    面向对象的面试题
    属性,类方法,静态方法,Python2和3方法
    类的抽象类接口类,多态封装
    类的继承
    面向对象空间和组合
  • 原文地址:https://www.cnblogs.com/zhuxibo/p/14308693.html
Copyright © 2020-2023  润新知