程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python單例模式

編輯:Python

前言

#單例模式是指讓一個類只能創建出唯一的實例,下面用裝飾器和元類這兩種方式來實現單例模式,因為這兩種方式的通用性最強。

單例模式

  • 前言
  • 一.利用裝飾器實現單例模式
  • 二.利用元類實現單例模式
  • 總結

一.利用裝飾器實現單例模式

創建一個字典,類名設為鍵,類的實例設為鍵的值。每次創建實例時,都會先看是否有實例存在,存在實例就直接返回該實例即可。

def singleton(cls):
# 生成一個空字典
instance = {
}
# judge函數判斷是否有實例存在,有:返回該實例 。無:創建實例並加入到字典
# cls是實例名,cls()是創建實例
def judge():
if cls not in instance:
instance[cls] = cls()
print(cls) #輸出實例名
return instance[cls] #返回該實例
return judge #裝飾器最後返回該函數
@singleton #裝飾器的核心就是將函數作為參數傳入另一個函數 singleton(ceshi)
class ceshi():
def __init__(self):
pass
p1 = ceshi()
p2 = ceshi()
p3 = ceshi()
print(id(p1),id(p2),id(p3)) #查看所有實例的id
#>>> <class '__main__.ceshi'>
#>>> 1298494399496 1298494399496 1298494399496

當然你也可以不用字典來接收,大可以用一個值來接受類的實例

def singleton(cls):
# 把類的實例
instance = cls()
# judge函數判斷是否有實例存在,有:返回該實例 。無:創建實例並加入到字典
# cls是實例名,cls()是創建實例
def judge():
return instance #返回該實例
return judge #裝飾器最後返回該函數
@singleton #裝飾器的核心就是將函數作為參數傳入另一個函數 singleton(ceshi)
class ceshi():
def __init__(self):
pass
p1 = ceshi()
p2 = ceshi()
p3 = ceshi()
print(id(p1),id(p2),id(p3)) #查看所有實例的id
#>>> 2049299719176 2049299719176 2049299719176

如果生成一個連接數據庫的類,可以給類傳入參數

def singleton(cls):
# 生成一個默認實例
instance = cls('127.0.0.1','3306')
# cls是實例名,cls()是創建實例
def judge(*args,**kwargs):
if args or kwargs:
return cls(*args,**kwargs) #傳入新參數就生成新實例
return instance #沒有新參數就返回默認實例
return judge #裝飾器最後返回該函數
@singleton #裝飾器的核心就是將函數作為參數傳入另一個函數 singleton(Mysql)
class Mysql():
def __init__(self,host,port):
self.host = host
self.port = port
# 默認生成的都是一個內存地址
p1 = Mysql()
p2 = Mysql()
p3 = Mysql()
print(id(p1),id(p2),id(p3)) #查看所有實例的id 2436617218376 2436617218376 2436617218376
# 加入參數的內存地址不相同
a1 = Mysql('1.1.1.1', '1111')
a2 = Mysql('1.1.1.1', '2222')
print(id(a1),id(a2)) #2436617218504 2436617218440

二.利用元類實現單例模式

總結


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved