python實現單例的幾種方法

2021-09-19 01:34:02 字數 2979 閱讀 4926

單例模式,顧名思義就是乙個類只有乙個例項,這樣可以避免例項化多次浪費空間,而且避免同時操作乙個物件時可能出現不同步的問題。其核心結構中只包含乙個被稱為單例類的特殊類,類的物件只能存在乙個。面試題中經常被問題,先把常用的實現單例模式的方法總結如下:

將例項繫結到類變數_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...