Python 面向对象之单例模式

【一】单例模式概念

  • 单例模式是一种设计模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点。
  • 单例模式通常用于管理共享的资源,例如配置信息、数据库连接、线程池等。
  • 关键点在于如何判断这个类是否已经实例化
    • 通过模块导入:借助模块的底层导入原理
    • 通过元类实现:元类的魔法方法__call__会在实例化之前执行,可以进行判断
    • 通过装饰器实现:装饰器也会在实例化之前操作,可以尽心判断

【二】单例模式实现方法

【1】通过模块导入

  • 这是最简单并且最好理解的方法,建议就用这个
# module.py文件内容
class FuncTools(object):pass
func_tools = FuncTools()
# 需要导入这个功能对象的文件
from module import func_tools
functools......
  • 模块只会导入一次,第二次导入时在内存中找到了这个实例对象,所以就不会再次生成一个新的实例

【2】通过元类实现

  • 有一点难度
class MyMeta(type):__have_instance = Nonedef __call__(cls, *args, **kwargs):if not cls.__have_instance:obj = super().__call__(*args, **kwargs)cls.__have_instance = objreturn cls.__have_instanceclass Student(metaclass=MyMeta):def __init__(self, name):self.name = namestudent_one = Student("bruce")
print(student_one.name, id(student_one))
# bruce 2973012426224
student_two = Student("tom")
print(student_two.name, id(student_two))
# bruce 2973012426224
  • 在生成实例(student_one)的时候触发元类(MyMeta)的__call__方法进行判断没有实例,创建了实例
  • 在生成第二个实例(student_two)的时候再次触发元类(MyMeta)的__call__方法进行判断,有了实例直接返回已经存在,所以不会创建新的实例
  • 为什么是用的元类(MyMeta)的__call__方法呢?
    • 因为__init____new__都是在定义类(Student)的时候执行的
    • 仅执行了一次,并且还是在实例(student_one)之前触发的
    • 所以只能用元类(MyMeta)的__call__

【3】通过装饰器实现

  • 理解难度比元类好一点
def singleton(cls):cls_dict = {}def inner(*args, **kwargs):if cls not in cls_dict.keys():cls_dict[cls] = cls(*args, **kwargs)return cls_dict[cls]return inner
@singleton
class Student(object):def __init__(self, name):self.name = namestudent_one = Student("bruce")
print(student_one.name, id(student_one))
student_two = Student("tom")
print(student_two.name, id(student_two))
  • 通过装饰器singleton装饰类(Student
  • 在生成第一个学生(bruce)时,判断没有这个类没有产生实例,所以创建了实例(student_one
  • 在生成第二个学生(tom)时,判断这个类已经生成过实例,所以没有创建新的,返回第一次生成的实例(student_one

【三】总结

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/339204.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 911 C. Anji‘s Binary Tree

原题: C. Anji’s Binary Tree time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input output standard output Keksic keeps getting left on seen by Anji. Through a mutual friend, he’s figured out that Anji really …

人工智能行业的发展前景如何?

人工智能(AI)已经成为如今科技领域的热门话题之一,从图像识别到自动驾驶,从语音助手到智能机器人,AI技术正在改变我们的生活方式。随着技术的不断发展和应用的扩大,人工智能行业的发展前景无疑是非常广阔的…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-4系统的可控性Controllability(LTI)线性时不变

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-4系统的可控性Controllability-LTI线性时不变

数字之美:探秘数据可视化如何在我们的日常生活中展现魅力

数据可视化是如何通过多种方式走进我们生活的呢?它不仅仅是冰冷的数字和图表,更是一门让信息跃然纸上的艺术。让我们一同探讨数据可视化如何以多种方式渗透进我们的日常生活,为我们呈现丰富而生动的信息画卷。下面我就以可视化从业者的角度来…

网络正常运行时间监控工具

正常运行时间是衡量系统可靠性的指标,表示为机器工作和可用时间的百分比。当提到 IT 网络时,正常运行时间是衡量网络设备、网站和其他服务的可用性的指标。网络正常运行时间通常以百分位数来衡量,例如“五个 9”,这意味着系统在 9…

Jetson nano 实时性测试,使用stress-ng 和 cyclictest

系统:ubuntu18.04,Jetpack4.3 打上了实时补丁 安装stress-ng和cyclictest sudo apt-get install stress-ng sudo apt-get install rt-tests 无负载情况的实时性 让两个CPU满载运行60秒 两个CPU满载实时性: 测了一下,4个CPU满载的…

BFC 2024寻龙之旅奇幻启程,龙运市集化身沪上摩登祈福地

2024年1月20日起,BFC外滩金融中心(下称BFC)“有龙则灵LONGTIME”奇幻秘境重磅登陆外滩,以东方传统文化为载体,打造当代都市传奇新篇。巨型金红神龙空降BFC,以波澜壮阔之势开启新春之旅。外滩枫径龙运市集迎…

Ubuntu系统升级16.04升级18.04

Ubuntu系统升级16.04升级18.04_ubuntu16.04升级到18.04-CSDN博客 一、需求说明 作为Linux发行版中的后起之秀,Ubuntu 在短短几年时间里便迅速成长为从Linux初学者到实验室用计算机/服务器都适合使用的发行版,目前官网最新版本是22.04。Ubuntu16.04是201…

Qt中QGraphicsView总体架构学习

前沿 前段时间学习了下如何在QGraphicsView架构中绘制刻度尺,主要是与OnPainter中进行比较的,那么今天就来详细讲解下我对QGraphicsView框架的认知吧~ 最近一段时间想学习下,如果我有不正确的,欢迎留言探讨哟~ QGraphicsView架…

Windows RPC运行时漏洞事后总结

2022年4月前后,Windows RPC运行时被曝出存在远程代码执行漏洞,当时曾引起很多人广泛关注。微软很快做出反应,发布补丁程序进行修补。这次事件中,Windows远程过程调用(RPC)运行时共出现三个关键漏洞&#xf…

性能分析与调优: Linux 实现 off-CPU剖析与火焰图

目录 一、实验 1.环境 2.off-CPU 剖析与火焰图 一、实验 1.环境 (1)主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192.…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-3(1) 刚体的位形 Configuration of Rigid Body

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…