单例模式

简介: 单例模式

一、简介

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在,并提供全局访问点。因此,单例模式通常用于日志记录、数据库操作、打印机后台及其他程序---该程序只生成一个实例,以避免对同一资源产生相互冲突的请求。

简言之,单例设计模式的意图如下:

1

2

3

确保类有且只有一个对象被创建

为对象提供一个访问点,以使程序可以全局访问该对象

控制共享资源的并行访问

利用Python实现经典的单例模式:(使用__new__方法)

new方法为python实例化创建对象自动执行的函数,通过重写这个函数,使之先判断该类中是否有instance属性(利用反射),若没有则为创建一个对象并为该属性赋值,最后返回instance中的对象。通过这种方式我们实现了每次创建实例返回的都是类中的instance的值。

单例模式之懒汉式实例化

单例模式的用例之一就是懒汉式实例化。例如,在导入模块的时候,我们可能会无意中创建一个对象,但时却根本用不到他、懒汉式实例化能够确保在需要时才创建对象

感觉像是手动完成单例创建逻辑,但注意获得实例一定要调用Singleton.getInstance()方法,直接s=Singleton()相当于没用单例

Monostate单例模式:

这种模式的理念为:实例化的对象是不同的,但是对象的状态,属性是相同的,也就是单态模式

这里的实现方式为利用类中的dict方法,我感觉是将_shared_state赋给dict后,每个对象的dict的地址都是相同的,所以对象的属性存储的位置都相同,那么一个对象的属性变化,其余的属性也会发生变化      

元类单例模式:

执行Loggre后,首先会调用MetaSingleton中的call函数,如果Singleton类没有在instance中,则为其创建一个实例,也就是正常调用type中的call函数,将返回的对象存在instance中,以该类名为键,对象为值,最后返回这个对象,若instance中有该类,那就直接返回存储的对象。 这种方式我觉得较好,不用为每个类单独创建单例模式,只需将元类重写即可

元类参考链接:https://www.cnblogs.com/yssjun/p/9832526.html

用 __call__() 弥补 hasattr() 函数的短板

hasattr() 函数的功能是查找类的实例对象中是否包含指定名称的属性或者方法,但该函数有一个缺陷,即它无法判断该指定的名称,到底是类属性还是类方法。


要解决这个问题,我们可以借助可调用对象的概念。要知道,类实例对象包含的方法,其实也属于可调用对象,但类属性却不是。举个例子:

可以看到,由于 name 是类属性,它没有以 call 为名的 call() 方法;而 say 是类方法,它是可调用对象,因此它有 call() 方法。

另外,我们可以通过__call__中调用我们想要调用的方法。参数传递可以利用*args和**kwards。

 

相关文章
|
API Python
pypi发布问题
我最经在发布我的更新包的时候遇到了ERROR HTTPError: 403 Forbidden from https://upload.pypi.org/legacy/ Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for more information.这样的问题。
|
开发工具 git
vue3+ts:约定式提交(git husky + gitHooks)
vue3+ts:约定式提交(git husky + gitHooks)
316 0
|
Java Shell 网络安全
springboot 远程调用shell脚本,环境为windows
本文是博主学习SpringBoot的记录,希望对大家有所帮助。
1219 0
springboot 远程调用shell脚本,环境为windows
|
存储 JSON 安全
Python中数据类转换为JSON的方法
Python中数据类转换为JSON的方法
375 0
|
4月前
|
搜索推荐 安全 API
电商API接口开放平台的生态构建与运营策略
本文探讨了电商API接口开放平台在推动电商行业发展中的重要作用,涵盖用户体验提升、业务创新促进、运营效率提高及销售渠道拓展等方面。同时,文章分析了生态构建的关键要素,如明确目标受众、制定吸引政策和强化支持体系,并提出数据共享、个性化服务与安全合规等运营策略。最后展望未来,指出跨平台支持、个性化服务与生态共赢将成为主要发展趋势,为电商行业的持续创新提供参考。
187 2
|
4月前
|
SQL 分布式计算 编译器
流批一体向量化引擎Flex
本文整理自蚂蚁集团技术专家刘勇在Flink Forward Asia 2024上的分享,聚焦流批一体向量化引擎的背景、架构及未来规划。内容涵盖向量化计算的基础原理(如SIMD指令)、现有技术现状,以及蚂蚁在Flink 1.18中引入的C++开发向量化计算实践。通过Flex引擎(基于Velox构建),实现比原生执行引擎更高的吞吐量和更低的成本。文章还详细介绍了功能性优化、正确性验证、易用性和稳定性建设,并展示了线上作业性能提升的具体数据(平均提升75%,最佳达14倍)。最后展望了未来规划,包括全新数据转换层、与Paimon结合及支持更多算子和SIMD函数。
273 9
流批一体向量化引擎Flex
|
4月前
|
SQL 存储 缓存
Fluss 实战:用 Partial Update 构建实时宽表的新范式
传统流式数据管道通过多表 Join 构建宽表,如实时推荐引擎需整合用户偏好、购买记录等8个数据源,但此方法在大规模场景下状态管理复杂、资源消耗高且调试困难。Fluss 提出部分更新方案,基于主键将各数据源独立写入共享宽表,避免复杂 Join 操作。示例中,通过 Flink SQL 创建推荐、曝光、点击等表,并逐步插入数据实现宽表构建。最终,借助 Fluss 的高效合并机制,输出包含最新信息的统一视图,提升可扩展性和维护性。
231 8
Fluss 实战:用 Partial Update 构建实时宽表的新范式
|
5月前
|
存储 关系型数据库 分布式数据库
【赵渝强老师】HBase的逻辑存储结构
HBase的逻辑存储结构包括命名空间、表和列族。命名空间类似关系型数据库中的数据库,用于逻辑划分和隔离数据;表以RowKey组织数据并按字典序排列,分为多个Region实现分布式存储;列族包含列且无需预先定义,由MemStore缓存写入数据,定期刷新生成Store File。文章通过视频和代码示例详细讲解了各部分的操作与功能。
180 2
|
4月前
|
监控 供应链 数据库连接
电商API:销量监控与竞品分析利器
电商数据接口API在现代电商运营中至关重要,可实现品牌价格、销量、评论等数据监控,优化销售策略。接入主流平台如淘宝、天猫、京东等API,或使用RPA技术取数,保障数据安全与效率。通过数据库连接、ERP直连等方式整合分析数据,监控竞品与价格,掌握市场动态。同时,注重数据安全性、技术支持及成本效益,助力企业在竞争中脱颖而出,提升业务效率与竞争力。
138 0
|
7月前
|
Oracle 关系型数据库 Java
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
本文介绍通过Flink CDC实现Oracle数据实时同步至崖山数据库(YashanDB)的方法,支持全量与增量同步,并涵盖新增、修改和删除的DML操作。内容包括环境准备(如JDK、Flink版本等)、Oracle日志归档启用、用户权限配置、增量日志记录设置、元数据迁移、Flink安装与配置、生成Flink SQL文件、Streampark部署,以及创建和启动实时同步任务的具体步骤。适合需要跨数据库实时同步方案的技术人员参考。
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山