在看原始碼的時候發現如下的單例模式,一開始不能理解。看了幾篇部落格後慢慢理解了。這裡簡單描述下我的理解。其中比較重要的一點是要記住類是元類的例項。
class singleton(type):
def __init__(cls, name, bases, dict):
super(singleton, cls).__init__(name, bases, dict)
print "singleton"
cls._instance = none
def __call__(cls, *args, **kwargs):
print "call"
if cls._instance is none:
cls._instance = super(singleton, cls).__call__(*args, **kwargs)
return cls._instance
class foo(object):
__metaclass__ = singleton
def __init__(self):
print "foo"
# print foo()
# print foo()
輸出如下
singleton
其中類foo是元類的例項,在其定義的時候會呼叫元類的new和init來建立它。
然後解除注釋,得到的結果如下:
singleton
call
foo<__main__.foo object at 0x0000000002f80978>
call
<__main__.foo object at 0x0000000002f80978>
由於foo是元類的例項,因此foo()會呼叫元類的__call__,它攔截了foo類的new和init。
在元類的__call__中呼叫了type的__call__,他會呼叫foo的new和init,返回foo類的例項。
第二次呼叫foo()的時候返回的是相同的例項,因此實現了單例。
用這種方式實現單例需要在__call__中返回類的例項,因為攔截了類的new和init
什麼是元類
元類中的__call__
python元類單例 元類實現單例模式
python中的類也是物件。元類就是用來建立這些類 物件 的,元類就是類的類,你可以這樣理解為 myclass metaclass 元類建立 myobject myclass 類建立例項 實際上myclass就是通過type 來創建立出myclass類,它是type 類的乙個例項 同時myclass...
學習筆記01 單例和元類
參考個人覺得講解的很透徹。元類是乙個類的類,該類是它的元類的乙個例項。類的定義由它的元類決定,所以我們用類a建立乙個類時,python通過呼叫a type name,bases,dict 建立它,name 類的名字,bases 基類,dict 屬性變數。如下兩段 其實作用一樣。建立乙個hello類,...
python 物件導向單例元類
通過類方法來實現單例,這樣我在執行乙個函式中建立物件,但是呼叫多次只是乙個例項。class person classmethod defsingle instancee cls,args,kwargs if notgetattr person,instance cls.instance person...