一、模組單例
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 方...