一、裝飾器裝飾類方法
from functools import wraps def wrapper(func): @wraps(func) def inner(self,*args,**kwargs): # 此時的self是Person的實例對象 self.name += "愛吃糖" # func ===> printInfo ret = func(self,*args,**kwargs) return ret return inner class Person(object): def __init__(self,name): self.name = name @wrapper def printInfo(self): print(self.name) # printInfo ==> wraper(printInfo) ==> inner Person("張三").printInfo() # 張三愛吃糖
二、類裝飾器實現單例模式
def wrapper(obj): def inner(name,*args,**kwrags): if not obj.instance: obj.instance = obj(name) return obj.instance return inner @wrapper class Person(object): instance = None def __init__(self,name): self.name = name def printInfo(self): print(self.name) zs = Person('張三') zs.printInfo() print(id(zs)) ls = Person('李四') ls.printInfo() print(id(ls))
三、給裝飾器寫log
import time from functools import wraps def log(func): @wraps(func) def inner(fun,*args,**kwargs): print("%s執行了"%(func)) ret = func(fun) return ret return inner @log def wraper(func): @wraps(func) def inner(*args,**kwargs): start_time = time.time() ret = func() endtime = time.time() - start_time print(endtime) return ret return inner @wraper def func(): time.sleep(5) print("func執行了") # wraper(func) ==>log(wraper) ==>inner # func() ==> wraper(func)==>inner func()
