zoukankan      html  css  js  c++  java
  • Python的单例模式

      一、何为单例模式

      单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。

      实现某个类只有一个实例的途径:

        1、让一个全局变量使得一个对象被访问,但是他不能防止外部实例化多个对象。

        2、让类自身保存他的唯一实例,这个类可以保证没有其他实例可以被创建。

      多线程时的单例模式:加锁-双重锁定

      饿汉式单例类:在类被加载时就将自己实例化(静态初始化)。其优点是躲避了多线程访问的安全性问题,缺点是提前占用系统资源。

      懒汉式单例类:在第一次被引用时,才将自己实例化。避免开始时占用系统资源,但是有多线程访问安全性问题。

      二、如何实现单例模式

      实现单例模式本人总结了三种方法:

      1、文件导入,当文件被当做模块被导入时,只执行一遍,因此一个类,只有一个实例,故此可为单例模式。

    import test
    #模块被导入时,自动执行test,创建唯一实例对象。
    

      2、类方法,创建单例模式。

    class Foo(object):
    	_instance = None
    				
    	def __init__(self):
    		pass
    					
    	@classmethod
    	def get_instance(cls):
    		if cls._instance:
    			return cls._instance
    		else:
    			obj = cls()
    			cls._instance = obj
    			return obj
    
    obj1 = Foo.get_instance()
    obj2 = Foo.get_instance()
    
    # 用id(), ==, is检测,看是否为同一对象。
    print(id(obj1))            # 39514520
    print(id(obj2))            # 39514520
    print(obj1 == obj2)    # True
    print(obj1 is obj2)       # True
    

      3、__new__方法,比方法二要好,采用的还是传统的实例方法,即类名+()。避免了繁琐的文档说明。

    class Foo(object):
        _instance = None
    
        def __init__(self):
            pass
    
        def __new__(cls, *args, **kwargs):
            if cls._instance:
                return cls._instance
            else:
                obj = object.__new__(cls,*args,**kwargs)
                cls._instance = obj
                return obj
    
    # 还是传统的实例化对象方法。
    obj1 = Foo()
    obj2 = Foo()
    
    # 用id() , == , is 检测,看是否为同一对象。
    
    print(id(obj1))                 # 39514520
    print(id(obj2))                 # 39514520   
    print(obj1 == obj2)        # True
    print(obj1 is obj2)           # True
    

      期待更新……

  • 相关阅读:
    继承项目第13周项目1基类中成员的访问限定符和派生类的继承方式
    架构业务wait和sleep区别狭义jiavaBean规范,三层架构模式
    文件文本编辑器ASP.net使用CKEditor(html文本编辑器)
    彩信对象android(5)_发彩信操作
    方法接口UML统一建模语言,java中七种设计原则,
    jquery实现jQuery实现图片轮播效果,jQuery实现焦点新闻
    设备文件BSP及嵌入式驱动开发笔记
    Invalidate
    C#集合类使用范例
    判断一段程序是由C 编译程序还是由C++编译程序编译的
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/7508060.html
Copyright © 2011-2022 走看看