Python实现单例模式详解
5星 · 超过95%的资源 5 浏览量
更新于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的类机制对于编写高效、可维护的代码至关重要。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2019-07-26 上传
2017-06-16 上传
2020-09-20 上传
2020-12-25 上传
2020-09-21 上传
2020-09-18 上传
weixin_38678300
- 粉丝: 4
- 资源: 1002
最新资源
- partial-left:返回一个函数,该函数具有部分应用的参数,这些参数位于提供给返回函数的参数之前
- IJKPlayer Android 可录屏 可播放RTSP格式
- mitsubishi 1_ladder_mitsubishiplc_Mitsubishi_PLC_
- 地图搜索app ui .fig素材下载
- jQuery实现的水平滑块拖动照片墙特效源码.zip
- charmeleon:Chokidar包装器可避免出现分段错误(以@thealphanerd的笑话命名)
- 基于java的-12-[计算机毕业设计]基于SSM的企业销售人员培训系统-源码.zip
- golion:OSGi 框架的 .NET 实现,由 C# 编写
- Python库 | azure-mgmt-documentdb-0.1.0.zip
- 办公学习app 多人讨论、视频会议 ui .xd素材下载
- CalculatorTest.zip_数学计算_Java_
- 21871619ds18b20_电赛_
- jQuery实现的文字上下滑动切换特效源码.zip
- node-cpanel-manage2:cPanel Manage2 API NodeJS包装器
- 易语言九宫解锁源码-易语言
- GeoMLA:时空数据的机器学习算法