Python單例模式的四種方法

2021-10-09 03:03:24 字數 1848 閱讀 2992

在這之前,先了解super()和__new__()方法

super()方法:

返回乙個父類或兄弟類型別的**物件,讓你能夠呼叫一些從繼承過來的方法。

它有兩個典型作用:

a. 在單繼承的類層次結構中,super()可用於引用父類而不顯式父類名稱,從而使**更易於維護。

b. 在多重繼承中,可以保證公共父類僅被執行一次。

__new__方法:

a.它是乙個類級別的靜態方法。通常用於控制生成乙個新例項的過程。

b.返回的是乙個例項化出來的例項

下面為四種實現單例模式的方法

使用__new__方法

class

singleton

(object):

def__new__

(cls,

*args,

**kwargs):if

nothasattr

(cls,

'_instance'):

orig =

super

(singleton, cls)

cls._instance = orig.__new__(cls,

*args,

**kwargs)

rerurn cls._instance

class

a(singleton)

:pass

# 類a即為單例類

2.共享屬性

'''

'''# 建立例項時把所有例項的__dict__指向同乙個字典,這樣它們都具有相同的屬性和方法(類的__dict__儲存物件屬性)

class

singleton

(object):

_state =

def__new__

(cls,

*args,

**kwargs)

: ob =

super

(singleton,cls)

.__new__(cls,

*args,

**kwargs)

ob.__dict__ = cls._state

return ob

class

b(singleton)

:pass

# 類b即為單例類

3.使用裝飾器

'''

'''def

singleton

(cls)

: instance =

def():

if cls not

in instance:

instance[cls]

= cls(

*args,

**kwargs)

return instance[cls]

@singleton

classc:

pass

# 類c即為單例類

4.import方法

# 作為python模組時是天然的單例模式

#建立乙個sington.py檔案,內容如下:

class

singleton

(object):

deffoo

(self)

:pass

mysington = singleton(

)# 運用

from sington import mysington

mysington.foo(

)

單例模式 四種

餓漢式 單例模式 餓漢式類載入到記憶體後,例項化乙個單例,jvm保證執行緒安全 都不能建立新的,所以安全,多執行緒都是安全的 簡單易用 缺點 不管是否用到,類載入時候就會例項化,浪費 一般專案開發中載入是用的class.forname 將class載入到記憶體,但不例項化,此時,如果使用餓漢,就會消...

python四種實現單例模式

coding utf 8 author xianyt date 2018 func 在預設的情況下建立多個物件的id不相同,如果想要設定為單例模式,可以通過 new 方法中的 instance 在 new 方法中把類例項繫結到類變數 instance上,如果cls.instance為none表示該類...

四種單例設計模式

public class singletonlazy 私有化該類的構造器 public static singletonlazy getinstance 如果沒有例項,就建立乙個 return instance 返回例項物件 public class singletonhungary 私有化該類的構...