## 介紹
**單例模式(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打印結果

### 方式三:用\_\_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打印結果

好了,先介紹這三種吧,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