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),是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。