python 單體模式 的幾種實現

2021-09-22 06:42:58 字數 2883 閱讀 6775

這是本人的一篇學習筆記。

本文用 python 實現單體模式,參考了這裡

class

borg:

_shared_state = {}

def__init__

(self

):self.__dict__ =

self._shared_state

class

singleton

(borg):

def__init__

(self

, name):

super().__init__()

self.name = name

def__str__

(self

):return

self.name

x = singleton('sausage'

)print(x)

y = singleton('eggs'

)print(y)

z = singleton('spam'

)print(z)

print(x)

print(y)

注意,這種方法實現的並非真正的單體模式!!

下面幾種方法實現的才是真正的單體模式

先看看這裡關於元類的描述:

元類一般用於建立類。

在執行類定義時,直譯器必須要知道這個類的正確的元類。直譯器會先尋找類屬性__metaclass__,如果此屬性存在,就將這個屬性賦值給此類作為它的元類。如果此屬性沒有定義,它會向上查詢父類中的__metaclass__。如果還沒有發現__metaclass__屬性,直譯器會檢查名字為__metaclass__的全域性變數,如果它存在,就使用它作為元類。否則, 使用內建的type作為此類的元類。

注意__call__的引數

class

singleton

(type

): _instance =

none

def__call__

(self, *

args,

**kw):

if self._instance is

none

: self._instance =

super().__call__(*args, **kw)

return

self._instance

class

myclass

(object

): __metaclass__ = singleton

print(myclass())

print(myclass())

注意__new__的引數

class

singleton

(type

): _instance =

none

def__new__

(cls, name, bases, dct):

if cls._instance is

none

: cls._instance =

super().__new__(cls, name, bases, dct)

return

cls._instance

class

myclass

(object

): __metaclass__ = singleton

print(myclass())

print(myclass())

注意__new__的引數

class

singleton

(object

): _instance =

none

def__new__

(cls):

if cls._instance is

none

: cls._instance =

super().__new__(cls)

return

cls._instance

class

myclass

(object

): __metaclass__ = singleton

print(myclass())

print(myclass())

下面還有乙個很巧妙的方法實現單體模式

class

singleton:

_instance =

none

@classmethod

defcreate

(cls):

if cls._instance is

none

: cls._instance = cls()

return

cls._instance

def__init__

(self

):self.x =

5# or whatever you want to do

sing = singleton.create()

print(sing.x) # 5

sec = singleton.create()

print(sec.x) # 5

單體模式的簡單實現

單體模式的思路 單體模式在多執行緒中容易出現被例項化多次的問題,因此要進行雙重為空判斷來緩解次問題 1.把建構函式的作用域改為私有的,那樣外面就不能new 2.通過乙個類的靜態方法得到乙個靜態例項 例如 public class a static a a null static a console....

python單例模式的幾種實現方式

單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。實現單例模式的幾種方法 1.使用模組 其實,python的模組就是天然的單例模式,因為模組在第一次匯入的時候,...

物件的單體模式和物件導向

class animal 一定不要加逗號,加了會報錯 showname var a2 new animal 小胡 12 a.showname1 列印出來 12 上面 定義了乙個 類 可以看到裡面有乙個constructor方法,這就是構造方法,而this關鍵字則代表例項物件。也就是說,es5 的建構...