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