一、装饰器装饰类方法
from functools import wrapsdef wrapper(func): @wraps(func) def inner(self,*args,**kwargs): # 此时的self是Person的实例对象 self.name += "爱吃糖" # func ===> printInfo ret = func(self,*args,**kwargs) return ret return innerclass Person(object): def __init__(self,name): self.name = name @wrapper def printInfo(self): print(self.name)# printInfo ==> wraper(printInfo) ==> innerPerson("张三").printInfo()# 张三爱吃糖
二、类装饰器实现单例模式
def wrapper(obj): def inner(name,*args,**kwrags): if not obj.instance: obj.instance = obj(name) return obj.instance return inner@wrapperclass 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 timefrom functools import wrapsdef log(func): @wraps(func) def inner(fun,*args,**kwargs): print("%s执行了"%(func)) ret = func(fun) return ret return inner@logdef 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@wraperdef func(): time.sleep(5) print("func执行了")# wraper(func) ==>log(wraper) ==>inner# func() ==> wraper(func)==>innerfunc()