python装饰器总结 发表于 2019-05-02 | 分类于 web | 阅读次数: 字数统计: 357 | 阅读时长 ≈ 1 写一个记录函数运行时间的装饰器123456789101112131415161718192021222324252627from functools import wrapsimport time# 使用直接装饰器 @listener(Monitor)class Monitor(object): @staticmethod def start_monitor(): return time.clock() @staticmethod def end_monitor(): return time.clock()def listener(listen): def log(func): @wraps(func) def wrapper(*args, **kw): startime = listen.start_monitor() f = func(*args, **kw) endtime = listen.end_monitor() print("total time is {0}".format(startime-endtime)) return f return wrapper return log 一个函数 挂多个装饰器的执行顺序1234567891011121314151617181920212223242526272829303132333435363738394041424344454647# -*- coding: utf-8 -*-import functools# 采用functools.wraps的目的是为了使装饰器返回的类型始终是func的类型,否则将返回嵌套高阶函数的中的类型,例如返回的是wraper# 采用参数*args ,**kw是解决函数多参数的问题def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper# 修饰器参数的情况def logger(pram): def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s(): and parsms is %s' %(func.__name__,pram)) return func(*args, **kw) return wrapper return log@logdef showMesage(name,age): print("my name is {0} and my age is {1}".format(name,age))@logger("hello")def getMessage(name,age): print("my name is {0} and my age is {1}".format(name,age))# 添加多个修饰器来拓展所需的功能@log@logger("hello15466")def recieveMessage(name,age): print("my name is {0} and my age is {1}".format(name,age))if __name__=='__main__': # showMesage("ddd",21) # getMessage("aaa",43) recieveMessage("ccc",34) 类装饰器带参数的装饰器