zoukankan      html  css  js  c++  java
  • Title

    三种单例模式

      python面试中一般会问到单例模式,下面介绍一下常见的3种python单例模式

    第一种 __new__方法
    class Foo(object):
        def __init__(self,name):
            self.name = name
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls,'_instance'):
                cls._instance = object.__new__(cls)
            return cls._instance
        # def __new__(cls, *args, **kwargs):
        #     if not hasattr(cls, '_instance'):
        #         cls._instance = super(Foo, cls).__new__(cls)
        #     return cls._instance
    f1= Foo('alex')
    print(f1.name,f1) # alex <__main__.Foo object at 0x0000000002249630>
    
    f2= Foo('egon')
    print(f2.name,f2) # egon <__main__.Foo object at 0x0000000002249630>
    
    print(f1 is f2)   # True
    
    # 反例
    class Foo(object):
        def __init__(self,name):
            self.name = name
    f3= Foo('alex')
    print(f3.name,f3) # alex <__main__.Foo object at 0x000000000215B4E0>
    
    f4= Foo('egon')
    print(f4.name,f4) # egon <__main__.Foo object at 0x0000000002AAF0B8>
    
    print(f3 is f4)   # False
      第二种 自定义classmethod方法
    class Foo:
        _instance = None
    
        def __init__(self, name):
            self.name = name
    
        @classmethod
        def get_instance(cls, name):      # 类方法, 第一个参数默认是类这个对象
            if cls._instance:             # 判断如果这个静态字段为真(已经存在实例)
                cls._instance.name=name   # 重新给name赋值
                return cls._instance      # 直接返回这个实例
            else:                         # 如果实例不存在
                obj = cls(name)           # 在类的内部创建一个实例,内部调用了init构造方法
                cls._instance = obj       # 将该实例赋值给类的静态字段,防止下次重复创建
                return obj                # 将新创建的对象返回
    
    
    # 经过上面的修改, 如果想实现单例模式, 就不能再使用init构造方法来创建对象了
    # f1= Foo('alex')
    # print(f1.name,f1) # alex <__main__.Foo object at 0x0000000002289A90>
    #
    # f2= Foo('egon')
    # print(f2.name,f2) # egon <__main__.Foo object at 0x00000000027B95C0>
    #
    # print(f1 is f2)   # False
    
    # 而是通过类方法创建
    f3 = Foo.get_instance("alex")  # 第一次会创建对象
    print(f3.name,f3)              # alex <__main__.Foo object at 0x0000000002A9F0B8>
    
    f4 = Foo.get_instance("egon")  # 第二次会使用第一次创建的对象
    print(f4.name,f4)              # egon <__main__.Foo object at 0x0000000002A9F0B8>
    
    print(f3 is f4)                # True
      第三种 import方法
    # mysingleton.py
    class My_Singleton(object):
        def foo(self):
            pass
     
    my_singleton = My_Singleton()
     
    # to use
    from mysingleton import my_singleton
     
    my_singleton.foo()
    

      

  • 相关阅读:
    【转】Intel Atom手机处理器“上窜下跳”
    神奇HVXC的MOS 分
    Skype 将支持 WebRTC 标准
    一篇文章算市值
    算法经典趣题三色旗
    Java基础(2)Java三大版本/体系
    一天一个 Linux 命令(27):mkfs 命令
    Java基础(1)Java特性及优势
    一天一个 Linux 命令(26):fdisk 命令
    关于Java中的整数类型值比较的疑问
  • 原文地址:https://www.cnblogs.com/guotianbao/p/7902527.html
Copyright © 2011-2022 走看看