python裝飾器系列 七

2022-09-16 08:48:10 字數 2152 閱讀 1408

裝飾器 利用__call__方法實現單例

所謂單例,是指乙個類的例項從始至終只能被建立一次。單例的實現有多種,這裡以__call__方法來實現

1

class

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()23

id(grok1)

4 140271956645592

1 grok2 =grok1()23

id(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__方法

對此方法中的**做進一步分析:

1

def__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裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...