裝飾器 利用__call__
方法實現單例
所謂單例,是指乙個類的例項從始至終只能被建立一次。單例的實現有多種,這裡以__call__
方法來實現
1class
single:
2__instance =none34
def__init__
(self,cls):
5 self.cls =cls67
def__call__(self,*args,**kwargs):
8if self.__instance
isnone:
9 self.__instance = self.cls(*args,**kwargs)
10return self.__instance
1@single
2class
grok1:
3pass
1 grok1 =grok1()23id(grok1)
4 140271956645592
1 grok2 =grok1()23id(grok2)
4 140271956645592
1 id(grok1) ==id(grok2)2 true
分析一下上邊的**
1@single
2class
grok1:
3pass
4 grok1 = grok1()
例項化grok1
類時相當於執行了下邊兩步:
1 1. grok1 =single(grok1)2 2. grok1 = grok1()
第一步:執行single(grok1)
是返回乙個single
類的例項,並用乙個變數grok1指向這個例項物件,此時的grok1不是class grok1:
裡的grok1類,只是名字相同而已,single
類例項化時__init__
構建函式被呼叫,這裡會把self.cls
這個例項屬性指向grok1
類。
第二步:因single
類實現了__call__
方法,所以此例項是乙個可呼叫物件,這裡執行grok1 = grok1()
,其中的grok1
已不再是class grok1:
裡的類,而是single
類的例項物件,這裡呼叫例項物件就會執行__call__
方法
對此方法中的**做進一步分析:
1def__call__(self,*args,**kwargs):
2if self.__instance
isnone:
3 self.__instance = self.cls(*args,**kwargs)
4return self.__instance
當第一次呼叫時,if語句的結果為true,此時會執行self.__instance = self.cls(*args,**kwargs)
,其中的self.cls
指向grok1
類,即這裡表示例項化grok1
類,並把self.__instance
指向例項化grok1
類的物件,這樣__instance
就不再是none
了,當第二次呼叫__call__
函式時,if語句的結果為false,所以直接執行return self.__instance
,所以grok1
這個物件在被多次例項化後指向的例項化物件都是一樣的,其實是只被例項化了一次而已
python裝飾器系列 四
先來看乙個不帶引數的裝飾器 1 import time23 deftimeit fn 4def wrap args,kwargs 5 start time.time 6 ret fn args,kwargs 7print time.time start 8return ret9 return wra...
Python學習筆記(七) 裝飾器
toc 簡單來說,裝飾器就是用來包裝函式或類的 函式 它接收乙個物件 函式物件或類物件 並且返回乙個物件 函式物件或類物件 用於包裝函式的裝飾器 首先給出一段 然後我們試著用包裝器來包裝它 def squaresum a,b print input a,b return a 2 b 2 defsqu...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...