Python实现单例模式详解
5星 · 超过95%的资源 13 浏览量
更新于2024-08-30
收藏 50KB PDF 举报
"Python设计模式之单例模式实例"
在软件设计中,单例模式是一种常用的设计模式,它的主要目的是确保某一个类只有一个实例,并提供一个全局访问点。在Python中,实现单例模式的方式多种多样,这里我们关注的是基于类方法的简单实现。
首先,让我们分析给出的代码片段:
```python
class Foo(object):
__instance = None
def __init__(self):
pass
@classmethod
def getinstance(cls):
if (cls.__instance == None):
cls.__instance = Foo()
return cls.__instance
if __name__ == '__main__':
foo1 = Foo.getinstance()
foo2 = Foo.getinstance()
print(id(foo1))
print(id(foo2))
print(id(Foo()))
```
这段代码中,`Foo` 类定义了一个类变量 `__instance` 来保存类的唯一实例。`__init__` 方法是一个空方法,通常用于初始化实例,但在单例模式下,我们不需要实例有任何特定的初始化行为。`getinstance` 是一个类方法,它检查 `__instance` 是否为空,如果为空,则创建一个新的 `Foo` 实例并将其赋值给 `__instance`,然后返回这个实例。这样,每次调用 `getinstance` 都会返回同一个实例。
在主程序部分,`foo1` 和 `foo2` 分别调用 `getinstance` 获取实例,由于它们都指向同一实例,所以 `id(foo1)` 和 `id(foo2)` 的值是相同的。然而,`id(Foo())` 返回的是 `Foo` 类自身的地址,与实例的地址不同。
虽然这种简单的实现方式在很多情况下可以满足需求,但它存在一个问题:如果直接通过 `Foo()` 来创建实例,仍然可以创建多个实例,这违背了单例模式的初衷。为了解决这个问题,我们可以考虑结合 `__new__` 方法来实现更严格的单例:
```python
class Singleton(object):
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls.__instance
def __init__(self):
pass
```
在这个版本中,我们重写了 `__new__` 方法,它在创建新对象时被调用。`__new__` 首先检查 `__instance` 是否为 `None`,如果是,则通过调用父类的 `__new__` 方法创建一个新实例,并将其赋值给 `__instance`。之后,无论何时通过 `Singleton()` 创建实例,`__new__` 都会返回已存在的实例,从而保证了单例特性。
`__init__` 方法仍然是空的,因为单例模式下我们通常不期望实例有任何特定的初始化行为。不过,如果需要在实例创建后执行某些操作,可以在 `__init__` 中添加这些逻辑。
Python 中实现单例模式可以有多种策略,如上述的类方法和 `__new__` 方法。选择哪种方式取决于具体的需求和项目规范。理解这些设计模式和Python的类机制对于编写高效、可维护的代码至关重要。
2021-01-20 上传
2020-09-18 上传
2019-07-26 上传
2017-06-16 上传
2020-09-20 上传
2020-12-25 上传
2020-12-26 上传
2020-09-19 上传
点击了解资源详情
weixin_38678300
- 粉丝: 4
- 资源: 1002
最新资源
- 前端协作项目:发布猜图游戏功能与待修复事项
- Spring框架REST服务开发实践指南
- ALU课设实现基础与高级运算功能
- 深入了解STK:C++音频信号处理综合工具套件
- 华中科技大学电信学院软件无线电实验资料汇总
- CGSN数据解析与集成验证工具集:Python和Shell脚本
- Java实现的远程视频会议系统开发教程
- Change-OEM: 用Java修改Windows OEM信息与Logo
- cmnd:文本到远程API的桥接平台开发
- 解决BIOS刷写错误28:PRR.exe的应用与效果
- 深度学习对抗攻击库:adversarial_robustness_toolbox 1.10.0
- Win7系统CP2102驱动下载与安装指南
- 深入理解Java中的函数式编程技巧
- GY-906 MLX90614ESF传感器模块温度采集应用资料
- Adversarial Robustness Toolbox 1.15.1 工具包安装教程
- GNU Radio的供应商中立SDR开发包:gr-sdr介绍