《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 1.5 单例模式

简介:

本节书摘来自华章出版社《Python编程实战:运用设计模式、并发和程序库创建高质量程序》一 书中的第1章,第1.1节,作者:(美) Mark Summerfield,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.5 单例模式

在整个程序运行过程中,如果某个类只应该有一个实例,那么可通过单例模式来保证。
有些面向对象编程语言很难创建单例,但在Python语言中却非常简单。Python Cookbook(code.activestate.com/recipes/langs/python/)提供了非常易用的Singleton类,只要继承它,就会成为单例。此外还提供了Borg类,可以用另一种方式实现单例效果。
然而在Python中实现单例最为简单的办法是:创建模块时,把全局状态放在私有变量中,并提供用于访问此变量的公开函数。比方说,在第7章的currency范例中,我们要创建一个函数,令其返回含有货币汇率的字典(该字典以货币名称为键,以汇率为值)。这个函数可能会调用很多次,但大部分情况下,汇率数据只获取一次就够了,无须每次调用时都获取一遍。此需求可以通过单例模式来实现。
screenshot

这段代码节选自currency/Rates.py模块(与往常一样,节选代码时也略去了import语句)。我们创建了名为rates的字典,用于保存私有数据,并将该字典设置成Rates.get()函数的属性。第一次执行公开的get()函数时(或者以refresh=True为参数调用时),会下载全新的汇率数据;其他时候只需把最近下载的那份数据返回就行了。尽管没有引入类,但我们依然把汇率数据做成了“单例数据值”(singleton data value),若要添加其他单例值,亦可仿照此法。
创建型设计模式在Python语言中都很容易实现。单例模式可以直接用模块来实现,而原型模式则显得多余,尽管也可以通过copy模块来实现,但Python语言能够动态访问类对象,所以没必要那么做。最有用的创建型设计模式是抽象工厂模式、工厂方法模式与建造者模式,它们的实现方式有很多种。创建好基本的对象之后,一般需要通过组合或适配来创建更为复杂的对象。下一章就来谈谈这个问题。

相关文章
|
3天前
|
Linux Python Windows
打包Python程序文件:pyinstaller实现
本文介绍基于Python语言中的pyinstaller模块,将写好的.py格式的Python代码及其所用到的所有第三方库打包,生成.exe格式的可执行文件,从而方便地在其他环境、其他电脑中直接执行这一可执行文件的方法。
|
4天前
|
数据采集 JSON 数据库
800个程序实例、5万行代码!清华大学出版【Python王者归来】
Python 的丰富模块(module)以及广泛的应用范围,使 Python 成为当下最重要的计算机语言之一,本书尝试将所有常用模块与应用分门别类组织起来,相信只要读者遵循本书实例,定可以轻松学会 Python 语法与应用,逐步向 Python 高手之路迈进,这也是撰写本书的目的。 本书以约 800 个程序实例讲解了:完整的 Python 语法,Python 的输入与输出,Python 的数据型态,列表(list)、元组(tuple)、字典(dict)、集合(set),函数设计,类别设计,使用系统与外部模块(module),设计自己的模块(module),文件压缩与解压缩,程序除错与异常处理…
|
7天前
|
数据库连接 Python
如何提高python程序代码的健壮性
在编程的时候,我们难免会遇到一些不可靠的情况,比如网络请求失败,数据库连接超时等等。这些不确定性会让我们的程序容易出现各种错误和异常。那么如何来增加程序的容错性和健壮性呢? 可能大多数人会想到使用try except来进行异常捕捉进行失败重试(Retry)。虽然try-escept一个非常常见和有效的方式来增强程序稳定性,但是可能一不小心就会造成栈溢出。 所以接下来我就来介绍一个另外的一个专门用于失败重试的库:retrying。
|
7天前
|
存储 算法 Python
Python编程作业一:程序基本流程
Python编程作业一:程序基本流程
14 0
|
7天前
|
网络协议 Python
在python中利用TCP协议编写简单网络通信程序,要求服务器端和客户端进行信息互传。 - 蓝易云
在这个示例中,服务器端创建一个socket并监听本地的12345端口。当客户端连接后,服务器发送一条欢迎消息,然后关闭连接。客户端创建一个socket,连接到服务器,接收消息,然后关闭连接。
62 0
|
8天前
|
数据采集 安全 数据挖掘
2024年最新7 年 Python 的我,总结了这 90 条写 Python 程序的建议,上海大厂Python面试经历
2024年最新7 年 Python 的我,总结了这 90 条写 Python 程序的建议,上海大厂Python面试经历
2024年最新7 年 Python 的我,总结了这 90 条写 Python 程序的建议,上海大厂Python面试经历
|
8天前
|
Python
2024年最新【Python】程序的组织结构:顺序结构,2024年最新46道面试题带你了解中高级Python面试
2024年最新【Python】程序的组织结构:顺序结构,2024年最新46道面试题带你了解中高级Python面试
2024年最新【Python】程序的组织结构:顺序结构,2024年最新46道面试题带你了解中高级Python面试
|
8天前
|
机器学习/深度学习 数据采集 数据挖掘
90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来_代码需要跑很久怎么办(2)
90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来_代码需要跑很久怎么办(2)
|
9天前
|
机器学习/深度学习 数据采集 Java
如何提高Python程序的性能
Python作为一种高级编程语言,具有易学易用、开发效率高等优点,但其在性能上可能不如C++或Java。本文将介绍如何通过一些技巧和工具来提高Python程序的性能。
|
10天前
|
Python
深入 Python 套接字编程:高级特性与并发处理
【5月更文挑战第18天】本文探讨了Python套接字编程的高级特性,包括非阻塞套接字、超时设置和端口复用,以及并发处理方法:多线程、多进程和异步I/O(如`asyncio`)。通过示例展示了多线程服务器如何处理客户端连接。同时强调并发处理时需注意资源竞争和同步,并合理配置线程数。学习这些技能将有助于构建高效、灵活的网络应用,应对不断发展的技术挑战。
28 10