python 裝飾器

0 介紹

先了解內嵌函數,回調函數,裝飾器之間的關係

1 裝飾器結構

裝飾器本質上也是一個函數,內部通過一個內嵌函數實現,
該函數用來處理其他函數,它可以讓其他函數在不需要修改代碼的前提下增加額外的功能
裝飾器的返回值也是一個函數對象,
特殊的地方是裝飾器的參數是一個函數。

import time
#2 define decoration function,use function decorated as parameter
def funcDecorator(func):
#3 use nested function to implement the decoration
def fDecoration():
print(' decoration operation before decorated ...')
func()
print(' decoration operation after decorated ...')
#4 retrun function after decorating
return fDecoration

#1 define function which needs to be decorated
def funcMy():
print(time.ctime())

afterDecorated = funcDecorator(funcMy)
afterDecorated()

案例: 使用@實現
#1 define function which needs to be decorated
@funcDecorator # like funcMy = funcDecorator(funcMy)
def funcMy():
print(time.ctime())

funcMy()

2 帶參數的被裝飾函數

import time

def funcDecorator(func):
#2 declare parameter in nest function
def fDecoration(x,y):
print(' decoration operation before decorated ...')
#3 transmit parameter to function decorated
func(x,y)
print(' decoration operation after decorated ...')
return fDecoration

@funcDecorator # like funcMy = funcDecorator(funcMy)
#1 declare parameter in function decorated
def funcMy(x,y):
print('x+y = %s'%(x+y,))
print(time.ctime())

funcMy(1,2)

3 帶參數的裝飾器

爲裝飾器的編寫和使用提供了更大的靈活性
import time
def flagDecorator(flag):
def funcDecorator(func):
def fDecoration(x,y):
if flag == 1:
print('start decorating ...')
print(' decoration operation before decorated ...')
func(x,y)
print(' decoration operation after decorated ...')
return fDecoration
return funcDecorator

#2 steps execution
#first: funcDecorator = flagDecorator(1)
#second: funcMy = funcDecorator(funcMy)br/>@flagDecorator(1)
def funcMy(x,y):
print('x+y = %s'%(x+y,))
print(time.ctime())

funcMy(1,2)

4 類裝飾器

import time
class Decorator(object):
#1 initial class,use function decorated as parameter
def init(self,func):
self._func = func

def __call__(self,x,y):
    print(' decoration operation before decorated ...')
            #2 decorate function
    self._func(x,y)
    print(' decoration operation after decorated ...')  

@Decorator #funcMy = Decorator(funcMy)
def funcMy(x,y):
print('x+y = %s'%(x+y,))
print(time.ctime())

funcMy(1,2)

類方法回調
import time
class Decorator(object):
def init(self,func=None):
self._func = func

def __call__(self,x,y):
    print(' decoration operation before decorated ...')
    self._func(x,y)
    print(' decoration operation after decorated ...')
#1 define decorator    
def myDecoration(self,func):
    #decorate function
    def Wrapper(x,y):    
        print(' decoration operation before decorated ...')
        func(x,y)
        print(' decoration operation after decorated ...')
    return Wrapper

#3 create class instance
deco = Decorator()
#4 decoratebr/>@deco.myDecoration
def funcMy(x,y):
print('x+y = %s'%(x+y,))
print(time.ctime())

回調函數,或簡稱回調(Callback),是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章