python 裝飾器

裝飾器   用於減小重複代碼,使得代碼在編寫時更加簡潔、靈活函數

一、裝飾器(函數)裝飾函數(這個有點繞)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

相關文章
相關標籤/搜索