## 介绍
**单例模式(Singleton Pattern)**是一种常用的软件设计模式,该模式的主要目的是确保**某一个类只有一个实例存在**。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
## 单例模式的实现
### 方式一:python就是天然的单例模式
其实,**Python 的模块就是天然的单例模式**,因为模块在第一次导入时,会生成 `.pyc` 文件,当第二次导入时,就会直接加载 `.pyc` 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
```
~~~
class Person():
def foo(self):
pass
p1 = Person()
~~~
```
在另一个文件中导入使用就可以了。
~~~
from a.b import p1
print(id(p1.foo()))
~~~
你会发现,不管使用多少次,或者在几个文件中引用,每次打印的id都是相同的。
### 方式二:使用装饰器
~~~
def outer(cls):
instance = None
def inner(*args,**kwargs):
nonlocal instance
if instance == None:
instance = cls(*args,**kwargs)
return instance
return inner
@outer
class Person():
def __init__(self):
pass
p1 = Person()
p2 = Person()
print(id(p1))
print(id(p2))
~~~
id打印结果
![](https://img.kancloud.cn/26/d9/26d90c7d644d5f3cf678941394728955_859x161.png)
### 方式三:用\_\_new\_\_方式实现单例模式
我们知道,当我们实例化一个对象时,是**先执行了类的\_\_new\_\_方法**(我们没写时,默认调用object.\_\_new\_\_),**实例化对象**;然后**再执行类的\_\_init\_\_方法**,对这个对象进行初始化,所有我们可以基于这个,实现单例模式。
~~~
class Person(object):
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self):
pass
p1 = Person()
p2 = Person()
print(id(p1))
print(id(p2))
~~~
id打印结果
![](https://img.kancloud.cn/cb/57/cb579e648000eb568d0953864ce11b87_906x139.png)
好了,先介绍这三种吧,python实现单例模式方式有很多,以后慢慢补。
# 未完待续。。。
- Python学习
- Python基础
- Python初识
- 列表生成式,生成器,可迭代对象,迭代器详解
- Python面向对象
- Python中的单例模式
- Python变量作用域、LEGB、闭包
- Python异常处理
- Python操作正则
- Python中的赋值与深浅拷贝
- Python自定义CLI三方库
- Python并发编程
- Python之进程
- Python之线程
- Python之协程
- Python并发编程与IO模型
- Python网络编程
- Python之socket网络编程
- Django学习
- 反向解析
- Cookie和Session操作
- 文件上传
- 缓存的配置和使用
- 信号
- FBV&&CBV&&中间件
- Django补充
- 用户认证
- 分页
- 自定义搜索组件
- Celery
- 搭建sentry平台监控
- DRF学习
- drf概述
- Flask学习
- 项目拆分
- 三方模块使用
- 爬虫学习
- Http和Https区别
- 请求相关库
- 解析相关库
- 常见面试题
- 面试题
- 面试题解析
- 网络原理
- 计算机网络知识简单介绍
- 详解TCP三次握手、四次挥手及11种状态
- 消息队列和数据库
- 消息队列之RabbitMQ
- 数据库之Redis
- 数据库之初识MySQL
- 数据库之MySQL进阶
- 数据库之MySQL补充
- 数据库之Python操作MySQL
- Kafka常用命令
- Linux学习
- Linux基础命令
- Git
- Git介绍
- Git基本配置及理论
- Git常用命令
- Docker
- Docker基本使用
- Docker常用命令
- Docker容器数据卷
- Dockerfile
- Docker网络原理
- docker-compose
- Docker Swarm
- HTML
- CSS
- JS
- VUE