博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python的单例模式
阅读量:6989 次
发布时间:2019-06-27

本文共 1458 字,大约阅读时间需要 4 分钟。

  一、何为单例模式

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

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

    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 objobj1 = Foo.get_instance()obj2 = Foo.get_instance()# 用id(), ==, is检测,看是否为同一对象。print(id(obj1))            # 39514520print(id(obj2))            # 39514520print(obj1 == obj2)    # Trueprint(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))                 # 39514520print(id(obj2))                 # 39514520   print(obj1 == obj2)        # Trueprint(obj1 is obj2)           # True

  期待更新……

 

 
 
 

转载于:https://www.cnblogs.com/bingabcd/p/7508136.html

你可能感兴趣的文章
路由器利用loopback接口实现物理冗余链路的IPSEC ***
查看>>
在隧道上运行IS-IS 和is-is验证
查看>>
解决centos4不能使用yum的方法
查看>>
我的2015年小结
查看>>
jmeter3.x以上版本安装插件的方法
查看>>
读《做单--成交的秘密》有感
查看>>
Tomcat JDBC pool源码部析
查看>>
Windows 2003 服务器英文版本安装中文语言包
查看>>
非域环境下安装并配置Project Server 2007(三)
查看>>
Python 多进程开发与多线程开发
查看>>
Windows Server 2008 R2入门之用户管理
查看>>
技术演练_维护底层模块的变动自由度
查看>>
Tokyo Cabinet和Tokyo Tyrant简介
查看>>
攻克私有云通杀神器proxmox
查看>>
对比Windows 8模拟器(Simulator)和Windows Phone仿真器(Emulator)
查看>>
利用Shell开发跳板机功能脚本案例
查看>>
《Cisco交换机配置与管理完全手册》(第二版)前言和目录
查看>>
Javascript诞生记:C语言和Self语言X的产物
查看>>
你不是菜鸟(10):哥们儿,请放下大侠的“身段”
查看>>
SANS:2018年度事件响应调查报告
查看>>