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

2021-10-13 02:02:19 字數 2190 閱讀 3216

python中的類也是物件。元類就是用來建立這些類(物件)的,元類就是類的類,你可以這樣理解為:

myclass = metaclass()    #元類建立

myobject = myclass()     #類建立例項

實際上myclass就是通過type()來創建立出myclass類,它是type()類的乙個例項;同時myclass本身也是類,也可以建立出自己的例項,這裡就是myobject

函式type實際上是乙個元類。type就是python在背後用來建立所有類的元類。現在你想知道那為什麼type會全部採用小寫形式而不是type呢?好吧,我猜這是為了和str保持一致性,str是用來建立字串物件的類,而int是用來建立整數物件的類。type就是建立類物件的類。你可以通過檢查__class__屬性來看到這一點。python中所有的東西,注意,我是指所有的東西——都是物件。這包括整數、字串、函式以及類。它們全部都是物件,而且它們都是從乙個類建立而來。

那什麼是單例呢?為什麼我們要用單例設計模式?

我們首先來看看單例模式的使用場景,然後再來分析為什麼需要單例模式。

•        python的logger就是乙個單例模式,用以日誌記錄

•        windows的資源管理器是乙個單例模式

•        執行緒池,資料庫連線池等資源池一般也用單例模式

•        **計數器

從這些使用場景我們可以總結下什麼情況下需要單例模式:

1.        當每個例項都會占用資源,而且例項初始化會影響效能,這個時候就可以考慮使用單例模式,它給我們帶來的好處是只有乙個例項占用資源,並且只需初始化一次;

2.        當有同步需要的時候,可以通過乙個例項來進行同步控制,比如對某個共享檔案(如日誌檔案)的控制,對計數器的同步控制等,這種情況下由於只有乙個例項,所以不用擔心同步問題。

那什麼是單例呢?為什麼我們要用單例設計模式?

我們首先來看看單例模式的使用場景,然後再來分析為什麼需要單例模式。

•        python的logger就是乙個單例模式,用以日誌記錄

•        windows的資源管理器是乙個單例模式

•        執行緒池,資料庫連線池等資源池一般也用單例模式

•        **計數器

從這些使用場景我們可以總結下什麼情況下需要單例模式:

1.        當每個例項都會占用資源,而且例項初始化會影響效能,這個時候就可以考慮使用單例模式,它給我們帶來的好處是只有乙個例項占用資源,並且只需初始化一次;

2.        當有同步需要的時候,可以通過乙個例項來進行同步控制,比如對某個共享檔案(如日誌檔案)的控制,對計數器的同步控制等,這種情況下由於只有乙個例項,所以不用擔心同步問題。

在python中實現單例模式有幾種方法:

1. 使用模組

2. 使用裝飾器

3. 使用類

4. 基於__new__方法實現(推薦使用,方便)

5. 基於metaclass元類方式實現

這裡說說基於元類來實現。**如下:

class singleton(type):

def __init__(cls, name, bases, dic):

print('元類的__init__方法在被執行')

super(singleton, cls).__init__(name, bases, dic)

cls.instance = none

def __call__(cls, *args, **kwargs):

if not cls.instance:

print('建立乙個新物件')

cls.instance = super(singleton, cls).__call__(*args, **kwargs)

else:

print('單例,只能建立乙個物件')

return cls.instance

class a(metaclass=singleton):

# __metaclass__ = singleton

pass  # python3 取消了__metaclass__屬性

a = a()

b = a()

print(a is b)

print(a.__dict__)

元類的__init__方法在被執行

建立乙個新物件

單例,只能建立乙個物件

true

元類實現單例

單例1 元類的單例 1 import settings23 4class mymeat type 5呼叫 init 得到mysql呼叫之前的時候就有乙個預設的例項化的結果 6def init self,class name,class bases,class dic 7建立乙個初始化的物件,並把這個...

python 物件導向單例元類

通過類方法來實現單例,這樣我在執行乙個函式中建立物件,但是呼叫多次只是乙個例項。class person classmethod defsingle instancee cls,args,kwargs if notgetattr person,instance cls.instance person...

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

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