單例模式,顧名思義就是乙個類只有乙個例項,這樣可以避免例項化多次浪費空間,而且避免同時操作乙個物件時可能出現不同步的問題。其核心結構中只包含乙個被稱為單例類的特殊類,類的物件只能存在乙個。面試題中經常被問題,先把常用的實現單例模式的方法總結如下:
將例項繫結到類變數_instance中,有的話直接返回,沒有的話將類例項化並與_instance繫結缺點:當併發請求例項化的時候,生成的物件有可能不是同乙個
class singleton(object):
def __new__(cls,*args, **kwargs):
"""每一次例項化的時候,都返回同乙個instance物件"""
if not hasattr(cls,"_instance"):
cls._instance = super(singleton,cls).__new__(cls)
return cls._instance
def __init__(self):
pass
def func(self,data):
print("func is calling....")
s = singleton()
s1 = singleton()
print("id(s):",id(s))
print("id(s1)",id(s1))
assert id(s)==id(s1)," id(s) is nort equal id(s1)"
改進版本:加鎖,避免併發請求例項化時出現多個例項
import threading,time
class singleton(object):
_instance_lock = threading.lock()
def __new__(cls,*args,**kw):
if not hasattr(cls,"_instance"):
with singleton._instance_lock:
if not hasattr(cls,"_instance"):
singleton._instance = object.__new__(cls)
return singleton._instance
def __init__(self):
time.sleep(1)
def task(arg):
print(singleton())
if __name__ == "__main__":
for i in range(10):
t = threading.thread(target=task,args=[i])
t.start()
如果_instance中沒有類例項的話就新增,有就直接返回
def singleton(cls):
_instance = {}
def _singleton(*arg,**kw):
if cls not in _instance:
_instance[cls] = cls(*arg,**kw)
return _instance[cls]
return _singleton
@singleton
class myclass(object):
a = 1
def __init__(self,x = 0):
self.x = x
m = myclass(99)
m1 = myclass(00)
print("id(m):",id(m))
print("id(m1)",id(m1))
assert id(m)==id(m1)," id(m) is nort equal id(m1)"
print(m.x)#99
print(m1.x) #99
#定義到mymoudle模組中
#encoding=utf-8
class singleton(object):
def foo(self):
print('singleton')
singleton = singleton()
# 新的py檔案,將mymoudle模組中例項singleton匯入
from mymoudle import singleton
a = singleton
from mymoudle import singleton
b = singleton
print(id(a))
print(id(b))
assert id(a)==id(b)," id(a) is not equal id(b)"
缺點:例項化必須通過 obj = singleton.instance() ,如果用 obj=singleton() ,這種方式得到的不是單例
class singleton(object):
@classmethod
def instance(cls,*args,**kw):
if not hasattr(singleton,"_instance"):
singleton._instance = singleton(*args,**kw)
return singleton._instance
def __init__(self):
pass
s = singleton.instance()
s1 = singleton.instance()
print(id(s))
print(id(s1))
另外還有通過元類__metaclass__實現單例,鑑於比較難以理解,暫且不表,以後需要的話單獨寫篇文章。 實現單例模式的幾種方法
public class singleclass public static singleclass getinstance 2 懶漢式 類在被載入時不會被初始化,當第一次被使用時進行初始化,為保證單例,可以使用sychronized關鍵字確保執行緒安全,但是每次呼叫時都會同步。public cla...
實現單例模式的幾種方法
單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。在 python 中,我們可以用多種方法來實現單例模式 其實,python 的模組就是天然的單例模式,因為模組...
用python實現單例模式的幾種方法
使用 new 方法,python自省 class singleton object def new cls,args,kwargs 如果沒有隱變數 instance就呼叫 new 乙個,python自省 if not hasattr cls,instance orig super singleton...