zoukankan      html  css  js  c++  java
  • 单例模式和非单类模式

    单例模式:单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场. (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
  • 相关阅读:
    【马化腾如何工作】
    NOKIA格机方法
    C和C++资源
    JSP/Servlet 中的汉字编码问题
    好听力网站
    GRE单词法
    Visual Studio 2008的一些小技巧
    从键盘输入一个字符串,将其中的大写字母变小写字母,小写字母变大写字母,并输出 。
    中图文分类号 TP自动化技术、计算机技术
    保护您眼睛视力 对Win7/Vista/XP作如下设置
  • 原文地址:https://www.cnblogs.com/zhuxibo/p/14308693.html
Copyright © 2011-2022 走看看