Python 中单例模式的实现方法

单例 — 让 类 创建的对象,在系统中 只有唯一的一个实例;

  • 1)、定义一个类属性,初始值是 None ,用于记录 单例对象的引用;
  • 2)、重写 new 方法;
  • 3)、如果 类属性 is None,调用父类方法分配空间,并在类属性中记录结果;
  • 4)、返回 类属性 中记录的 对象引用;

class MusicPlayer(object):

    # 记录第一个被创建对象的引用
    instance = None

    def __new__(cls, *args, **kwargs):

        # 判断类属性是否是空对象
        if cls.instance is None:

            # 调用父类的方法,为第一个对象分配空间
            cls.instance = super().__new__(cls)
        # 返回类属性保存的对象引用
        return cls.instance

# 创建多个对象
play1 = MusicPlayer()
print(play1)

play2 = MusicPlayer()
print(play2)

只执行一次初始化工作:在每次使用 类名() 创建对象时,Python 的解释器都会自动调用两个方法:

  • 1)、new 分配空间;
  • 2)、init 对象初始化;

new 方法改造之后,每次都会得到 第一次被创建对象的引用,但是,初始化方法还会被两次调用;

需求:让 初始化动作 只被 执行一次;

解决办法:

  • 1)、定义一个类属性 _init_flag 标记是否 执行初始化动作,初始值为 False;
  • 2)、在 init 方法中,判断 _init_flag,如果为 False 就执行初始化动作;
  • 3)、然后将 _init_flag 设置为 True;
  • 4)、这样,再次 自动 调用 init 方法时,初始化动作就不会被再次执行;
class MusicPlayer(object):

    # 记录第一个被创建对象的引用
    instance = None

    # 记录是否执行过初始化动作
    init_flag = False

    def __new__(cls, *args, **kwargs):

        # 判断类属性是否是空对象
        if cls.instance is None:

            # 调用父类的方法,为第一个对象分配空间
            cls.instance = super().__new__(cls)
        # 返回类属性保存的对象引用
        return cls.instance

    def __init__(self):
        # 判断是否执行过初始化动作
        if MusicPlayer.init_flag:
            return
        # 如果没有执行过,在执行初始化动作
        print("初始化播放器")
        # 修改类属性的标记
        MusicPlayer.init_flag = True

# 创建多个对象
play1 = MusicPlayer()
print(play1)

play2 = MusicPlayer()
print(play2)

到此这篇关于Python 中单例模式的实现方法的文章就介绍到这了,更多相关Python 单例内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python reflect单例模式反射各个函数

    目录 reflect反射 实例分析 getattr()函数的使用方法 setattr() 函数对应函数 getattr() delattr 函数用于删除属性 单例模式 应用场景 reflect反射 首先,我们要区分两个概念——“标识名”和“字符串”. 两者字面上看起来一样,却是两种东西: 前者是函数func的函数名,后者只是一个叫“func”的字符串,两者是不同的事物.我们可以用func()的方式调用函数func,但我们不能用"func"()的方式调用函数.说白了就是,不能通过字符串来

  • Python实现单例模式的五种写法总结

    目录 使用模块 使用装饰器 基于 __new__ 方法实现 基于 metaclass 方式实现 单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息.如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConf

  • python单例模式之selenium driver实现单例

    目录 一.使用装饰器实现单例 二.web自动化driver实现单例模式 2.1编写单例模式的装饰器 2.2driver使用装饰器,实现单例模式 2.3获取driver的实例,就是单例了 三.在自动化项目中具体的应用 3.1项目结构 四.工具层Utils 4.1singleton.py是单例装饰器 4.2GetSeleniumDriver.py driver实现单例 五.页面元素层TsetSharelab 六.流程层 七.case层,把业务逻辑组成一条条用例 一.使用装饰器实现单例 def Sin

  • python设计模式之单例模式你了解多少

    目录 单例模式 概念 单例模式使用场景 python实现单例模式 总结 单例模式 概念 单例模式:"保证一个类仅有一个实例,并提供一个访问它的在这里插入代码片全局访问点. 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例. 单例模式应用的场景一般发现在以下条件下: (1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等.如上述中的日志文件,应用配置. (2)控制资源的情况下,方便资源之间的互相通信.如线程池等. 单例模式使用场景 - Web应用的配置对象的

  • Python实现单例模式的四种方式详解

    简介:单例模式可以保证一个类仅有一个实例,并提供一个访问它的全局访问点.适用性于当类只能有一个实例而且客户可以从一个众所周知的访问点访问它,例如访问数据库.MQ等. 实现方式: 1.通过导入模块实现 2.通过装饰器实现 3.通过使用类实现 4.通过__new__ 方法实现 单例模块方式被导入的源码:singleton.py # -*- coding: utf-8 -*- # time: 2022/5/17 10:31 # file: singleton.py # author: tom # 公众

  • Python实现单例模式的5种方法

    目录 基本介绍 优缺点 Python实现 方式1,元类实现: 方式2,继承实现: 方式3,装饰器实现: 方式4,模块实现: 方式5,@classmethod实现单例模式: 基本介绍 一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点. 单例模式应该是应用最广泛,实现最简单的一种创建型模式. 特点:全局唯一,允许更改 优缺点 优点: 避免对资源的多重占用,如写入文件操作 节省内存 防止命名空间被污染 缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而

  • python单例模式的应用场景实例讲解

    1.应用场景 需要频繁创建和销毁的对象: 创建花费太多时间或资源,但经常使用的对象: 工具类对象: 经常访问数据库或文件的对象. 2.实例 如果每个对象中封装了相同的数据,但是需要创建多个对象的时候,而且这两个实例所有的功能是一样的,所以我们就可以使用一个实例完成,在这里我们就可以使用单例模式,如下 class Person: def __init__(self): self.name = '123123' self.age = '20' def f1(self): pass def f2(se

  • Python中的单例模式与反射机制详解

    目录 单例模式 反射 hasatter getattr setattr 总结 单例模式 一般情况下,类可以生成任意个实例,而单例模式只生成一个实例 我们先用单例模式设计一个Rectangle类 然后用__new__方法设计单例模式,代码如下 class Rectangle: def __init__(self,length,width): self.length=length self.width=width def __new__(cls, *args, **kwargs):#__new__至

  • Python 设计模式创建型单例模式

    目录 一.单例模式 二.应用场景 三.编码示例 1.单线程中的单例模式 方式一.重载类构造器 方式二.实现单例装饰器 2.多线程中的单例模式 方式三.重载具有线程锁的类构造器 一.单例模式 单例模式,实现一个类,并且保证这个类的多次实例化操作,都会只生成同一个实例对象. 二.应用场景 整个系统中只需要存在一个实例对象,其他对象都可以通过访问该对象来获取信息,比如: 系统的配置信息对象 日志对象 数据库操作对象 线程池对象 三.编码示例 1.单线程中的单例模式 方式一.重载类构造器 定义: cla

  • Python 中单例模式的实现方法

    单例 — 让 类 创建的对象,在系统中 只有唯一的一个实例: 1).定义一个类属性,初始值是 None ,用于记录 单例对象的引用: 2).重写 new 方法: 3).如果 类属性 is None,调用父类方法分配空间,并在类属性中记录结果: 4).返回 类属性 中记录的 对象引用: class MusicPlayer(object): # 记录第一个被创建对象的引用 instance = None def __new__(cls, *args, **kwargs): # 判断类属性是否是空对象

  • 基于Python中单例模式的几种实现方式及优化详解

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息.如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪

  • 一文带你了解Python中的双下方法

    目录 前言 1. init方法 2. 运算符的双下方法 2.1 比较运算符 2.2 算术运算符 2.3 反向算术运算符 2.4 增量赋值运算符 2.4 位运算符 3.字符串表示 4.数值转换 5.集合相关的双下方法 6.迭代相关的双下方法 7.类相关的双下方法 7.1 实例的创建和销毁 7.2 属性管理 7.3 属性描述符 8.总结 前言 大家在写 Python 代码的时候有没有这样的疑问. 为什么数学中的+号,在字符串运算中却变成拼接功能,如'ab' + 'cd'结果为abcd:而*号变成了重

  • Python中class内置方法__init__与__new__作用与区别解析

    目录 背景 __init__方法作用 __new__方法作用 __init__ && __new__联系 使用__new__的场景 定义.继承immutable class 使用metaclass 参考文献 背景 最近尝试了解Django中ORM实现的原理,发现其用到了metaclass(元类)这一技术,进一步又涉及到Python class中有两个特殊内置方法__init__与__new__,决定先尝试探究一番两者的具体作用与区别.PS: 本文中涉及的类均为Python3中默认的新式类,

  • python中列表元素连接方法join用法实例

    本文实例讲述了python中列表元素连接方法join用法.分享给大家供大家参考.具体分析如下: 创建列表: >>> music = ["Abba","Rolling Stones","Black Sabbath","Metallica"] >>> print music 输出: ['Abba', 'Rolling Stones', 'Black Sabbath', 'Metallica']

  • python中List的sort方法指南

    简单记一下python中List的sort方法(或者sorted内建函数)的用法. List的元素可以是各种东西,字符串,字典,自己定义的类等. sorted函数用法如下: sorted(data, cmp=None, key=None, reverse=False) 其中,data是待排序数据,可以使List或者iterator, cmp和key都是函数,这两个函数作用与data的元素上产生一个结果,sorted方法根据这个结果来排序. cmp(e1, e2) 是带两个参数的比较函数, 返回值

  • python中使用序列的方法

    本文实例讲述了python中使用序列的方法.分享给大家供大家参考.具体如下: 列表.元组和字符串都是序列,但是序列是什么,它们为什么如此特别呢?序列的两个主要特点是索引操作符和切片操作符.索引操作符让我们可以从序列中抓取一个特定项目.切片操作符让我们能够获取序列的一个切片,即一部分序列. #!/usr/bin/python # Filename: seq.py shoplist = ['apple', 'mango', 'carrot', 'banana'] # Indexing or 'Sub

  • python中base64加密解密方法实例分析

    本文实例讲述了python中base64加密解密方法.分享给大家供大家参考.具体分析如下: 一.base64 Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符.三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示.它可用来作为电子邮件的传输编码.在Base64中的可打印字符包括字母A-Z.a-z.数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同.编码后的

  • Python中生成Epoch的方法

    在Python2中datetime对象没有timestamp方法,不能很方便的生成epoch,现有方法没有处理很容易导致错误.关于Epoch可以参见时区与Epoch 0 Python中生成Epoch from datetime import datetime # python3 datetime.now().timestamp() # python2 import time time.mktime(datetime.now().timetuple()) # 为了兼容python2和3,该用法使用

  • 全面了解python中的类,对象,方法,属性

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗,它的颜色,大小,年龄,体重等是它的属性或特征.它会汪汪叫,会摇尾巴等是它的行为. 我们在描述一个真实对象(物体)时包括两个方面: 它可以做什么(行为) 它是什么样的(属性或特征). 在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象

随机推荐