Python學習記錄(元類和單例模式)

2021-09-25 00:06:44 字數 1146 閱讀 9303

在看原始碼的時候發現如下的單例模式,一開始不能理解。看了幾篇部落格後慢慢理解了。這裡簡單描述下我的理解。其中比較重要的一點是要記住類是元類的例項。

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...