【Python面向对象】(8) 装饰器之@wraps
@wraps能保证使用过该装饰器的方法能够拥有它原本的属性,例如__name__之类的
""" 带参数的装饰器 """ from functools import wraps def log(name=None): """ 记录函数执行的日志 """ def decorator(func): # *args表示传入元组类型,**kwargs表示传入字典类型 @wraps(func) def wrapper(*args, **kwargs): """ 装饰器内部的函数 """ print("{0}.start...".format(name)) print(args) print(kwargs) res = func(*args, **kwargs) print("{0}.end...".format(name)) return res return wrapper return decorator @log('hello') def hello(): """ 简单功能模拟 """ print("hello...") if __name__ == "__main__": # # 发现输出的都是装饰器的doc和name # print("doc:{}".format(hello.__doc__)) # 输出:doc: 装饰器内部的函数 # print("name:{}".format(hello.__name__)) # 输出:name:wrapper # 在装饰器前加了@wraps(func)后,输出原本的doc和name print("doc:{}".format(hello.__doc__)) # 输出:doc: 简单功能模拟 print("name:{}".format(hello.__name__)) # 输出:name:hello hello()