裝飾器 用於減小重複代碼,使得代碼在編寫時更加簡潔、靈活函數
一、裝飾器(函數)裝飾函數(這個有點繞)this
def a(func): def b(*args,**kw): print("this is start") func(*args,**kw) print("end") return return b @a def c(): print("here is the c function")
二、裝飾器類裝飾函數。類Desc裏含有all函數用來裝飾類Samp裏的one方法。這種方法能夠改變被裝飾類的屬性值。spa
class Desc(object): def __init__(self): pass def all(self, fun): #此處的self是指向Desc
print("in des") def out(self, *args, **kwargs): #此處的self是指向所裝飾的類 self.b = 2 fun(self, *args, **kwargs) #此處的self是指向所裝飾的類 return out class Samp(object): des = Desc() # 須要先實例一個類才能使用 def __init__(self): self.a = 'say hi' self.b = 0 @des.all def one(self): print self.a return
sa = Samp()
sa.one()
print sa.b
輸出以下:code
in des # 此處的輸出是在sa = Samp()實例化的時候就已經運行了def all(self, fun)函數裏的print("in des"),但並不會運行out()函數,因此,即便後面有不少個sa.one(),也只會輸出一次in des。 say hi 2 # self.b的值已經被改變了
三、裝飾器(類)裝飾 類blog
class Desc(object): def __init__(self,fun): self.fun = fun def __call__(self,*args,**kwargs): #此處的self是指向Desc本類 print "in des" self.b = 2 # 此處的self是指向Desc本類,因此被裝飾類的self.b並無改變 return self.fun(*args,**kwargs) @Desc class Sampee(object): def __init__(self): self.a = 'say hi' self.b = 0 def one(self): print self.a return def two(self): print self.b return
sa = Sampee() # 此處會先運行Desc的__init__和__call__,再到Sampee的__init__ sa.one() sa.two()
輸出以下:it
in des say hi 0
裝飾器類裝飾類,就至關方法裝飾方法,__call__函數是在調用類的時候觸發的函數,裝飾函數的主要內容都寫在__call__函數裏。在被裝飾的類實例化時會先運行裝飾類,Desc類中的__call__裝飾的就是Sampee類的初始化函數,初始化傳入參數,所對應的就是__call__傳入的參數。裝飾類與Sampee類的方法無關。io