由單例模式看python類的 new

2021-07-26 12:35:44 字數 789 閱讀 7552

在學到狀態機的實現時會用到單例模式,python實現單例模式的方法之一就是使用 __new__方法。

class

states

(object):

'''singleton pattern'''

def__new__

(cls, *args, **kw):

#cls is actually states

ifnot hasattr(cls, '_instance'):

orig = super(states, cls) #get father class

cls._instance = orig.__new__(cls, *args, **kw)

return cls._instance

此**是單例模式狀態基類的例子。

大部分類成員變數的第乙個引數是self——即例項本身。而__new__方法的第乙個引數是類本身(type型物件)——即這裡的states。

python建立乙個物件的過程是先呼叫__new__方法得到乙個物件的例項,然後呼叫__init__方法初始化例項中的成員變數。預設的__new__方法會從子類開始一直呼叫父類的__new__方法,直到最後呼叫object的__new__方法。但每次呼叫時傳入的cls引數都是子類的類物件(如這裡的states),所以最終能產生子類物件。

在單例模式中,每次新建乙個物件時我們先檢查該類是否已經有例項物件。如果有就直接返回該例項,如果沒有就呼叫父類的__new__方法新建乙個例項物件,並且儲存類的這個例項物件,以後就不再新建物件了。

python元類單例 元類實現單例模式

python中的類也是物件。元類就是用來建立這些類 物件 的,元類就是類的類,你可以這樣理解為 myclass metaclass 元類建立 myobject myclass 類建立例項 實際上myclass就是通過type 來創建立出myclass類,它是type 類的乙個例項 同時myclass...

python 類的單例模式的實現

python 類的單例模式的實現 單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。使用 1 在排程器的初始化 init 中初始化類,則會是單例了 2 使用 n...

python單例模式繼承 python單例模式

我們可以使用 new 這個特殊方法。該方法可以建立乙個其所在類的子類的物件。更可喜的是,我們的內建 object 基類實現了 new 方法,所以我們只需讓 sing 類繼承 object 類,就可以利用 object 的 new 方法來建立 sing 物件了。classsing object def...