在Python中用盡量多的方法實現單例模式

2021-10-01 17:58:21 字數 2509 閱讀 9139

一、模組單例

python 的模組就是天然的單例模式,因為模組在第一次匯入時,會生成 .pyc 檔案,當第二次匯入時,就會直接載入 .pyc 檔案,而不會再次執行模組**。

#foo1.py

class

singleton

(object):

deffoo

(self)

:pass

singleton = singleton(

)#foo.py

from foo1 import singleton

直接在其他檔案中匯入此檔案中的物件,這個物件即是單例模式的物件

二、靜態變數方法

先執行了類的__new__方法(我們沒寫時,預設呼叫object.__ new__),例項化物件;然後再執行類的__init__方法,對這個物件進行初始化,所有我們可以基於這個,實現單例模式。

'''

'''class

singleton

(object):

def__new__

(cls,a):if

nothasattr

(cls,

'_instance'):

cls._instance =

object

.__new__(cls)

return cls._instance

def__init__

(self,a)

: self.a = a

defaa(self)

:print

(self.a)

a = singleton(

"a")

變種:利用類的靜態方法或者類方法,實現對函式初始化的控制。該方法需要手動呼叫靜態方法實現例項。本質上是手動版的__ new__方法。

三、元類方法

此方法是在__new__方法的更上層對例項化過程進行控制。

原理:執行元類的 元類的__new__方法和__init__方法用來例項化類物件,__ call__ 方法用來對例項化的物件的例項即類的物件進行控制。__call__方法會呼叫例項類的 __new__方法,用於建立物件。返回物件給__call__方法,然後呼叫類物件的 __init__方法,用於對物件初始化。

'''

'''class

singleton1

(type):

def__init__

(self,

*args,

**kwargs)

: self.__instance =

none

super

(singleton1,self)

.__init__(

*args,

**kwargs)

def__call__

(self,

*args,

**kwargs)

:if self.__instance is

none

: self.__instance =

super

(singleton1,self)

.__call__(

*args,

**kwargs)

return self.__instance

class

singleton2

(type):

_inst =

def__call__

(cls,

*args,

**kwargs)

:print

(cls)

if cls not

in cls._inst:

cls._inst[cls]

=super

(singleton2, cls)

.__call__(

*args)

return cls._inst[cls]

class

c(metaclass=singleton1)

:pass

四、裝飾器

原理:裝飾器用來控制類呼叫__ call__方法。

def

singleton

(cls,

*args,

**kw)

: instance =

def_singleton

(args)

:if cls not

in instance:

instance[cls]

= cls(

*args,

**kw)

return instance[cls]

return _singleton

@singleton

classa:

pass

在串列埠傳輸中用盡可能少的字元表示資訊

最近在編寫茶葉色選軟體的時候,輸出訊號涉及到96個0 1字元。由於設計到串列埠傳輸後微控制器的操作,對傳輸速度的要求較高,需要盡量用較少的字元去表示所有的資訊。首先的思路是對96個字元每6個編1次組,轉換為16進製制的字元輸出,精簡後的長度為1 校驗位 24個字元,對方表示不夠短。考慮到對原始資料的...

在Python中用keys 方法返回字典鍵的教程

keys 方法返回在字典中的所有可用的鍵的列表。語法以下是keys 方法的語法 dict.keys 引數返回值 此方法返回在字典中的所有可用的鍵的列表。例子下面的例子顯示keys 方法的用法。usr bin python wuoerx dict print value s dictwww.cppcn...

Python中用sleep 方法操作時間的教程

mktim程式設計客棧e 方法是localtime 反函式。它的引數是struct time或全9元組,它程式設計客棧返回乙個浮點數,為了相容時time 如果輸入值不能表示為有效的時間,那麼overflowerror或valu程式設計客棧eerror錯誤將被引發。syntax 以下是mktime 方...