Python Decorator装饰器
来源:互联网 发布:qq网络硬盘在哪里找 编辑:程序博客网 时间:2024/06/05 16:55
1. 基本装饰器
1.1. 无参方法无参装饰器
# 无参log装饰器def log(func): def wrapper(): print('Log: excute method {}()'.format(func.__name__)) return func() return wrapper# 无参方法@logdef do_save(): print('save something!')# Log: excute method do_save()# save something!do_save()
1.2. 有参方法无参装饰器
利用(*args, **kwargs)
来表示任意参数。
此时若@log
则会出现异常,因为@log
装饰器的实现中并没有接收参数。
# 无参装饰器def log_new(func): def wrapper(*args, **kwargs): print('Log: excute method {}()'.format(func.__name__)) return func(*args, **kwargs) return wrapper# 带参数的方法# @log # TypeError need 1 argument@log_newdef do_save_user(user): print('save {}'.format(user))# Log: excute method do_save_user()# save JiangWdo_save_user('JiangW')
1.3. 有参方法有参装饰器
# 带参数的装饰器def log_level(level): def decorator(func): def wrapper(*args, **kwargs): print('Log[{}]: excute method {}()'.format(level, func.__name__)) return func(*args, **kwargs) return wrapper return decorator@log_level('INFO')def do_delete_user(user): print('delete {}'.format(user))# Log[INFO]: excute method do_delete_user()# delete JiangWdo_delete_user('JiangW')
2. 基于类实现的装饰器
2.1. 简单基于类实现的装饰器
# 带参数class LoggingLevel(object): def __init__(self, level): self.level = level def __call__(self, func): def wrapper(*args, **kwargs): print('Log[{}]: excute method {}()'.format(self.level, func.__name__)) return func(*args, **kwargs) return wrapper@LoggingLevel('WARN')def do_remove_user(user): print('remove {}'.format(user))# Log[WARN]: excute method do_remove_user()# remove JiangWdo_remove_user('JiangW')
3. 注意事项
3.1. 拆分装饰器
利用@log_level
语法糖来实现的装饰器。
def log_level(level): def decorator(func): def wrapper(*args, **kwargs): print('Log[{}]: excute method {}()'.format(level, func.__name__)) return func(*args, **kwargs) return wrapper return decorator@log_level('INFO')def do_delete_user(user): print('delete {}'.format(user))# Log[INFO]: excute method do_delete_user()# delete JiangWdo_delete_user('JiangW')
拆分成每一步实际上最终为:
# 等同于def do_delete_user(user): print('delete {}'.format(user))# # Log[INFO]: excute method do_delete_user()# delete JiangWdecorator = log_level('INFO')wrapper = decorator(do_delete_user)wrapper('Jian111gW')
3.2. 函数名称改变
如3.1所述拆分装饰器后实际上最终是调用了
wrapper = decorator(do_delete_user)wrapper('Jian111gW')
此时被@log_level
装饰器装饰的函数名已经变成了wrapper
print(do_delete_user.__name__) # wrapper
利用functools.wraps
来修正
def log_level(level): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): print('Log[{}]: excute method {}()'.format(level, func.__name__)) return func(*args, **kwargs) return wrapper return decorator@log_level('INFO')def do_delete_user(user): print('delete {}'.format(user))print(do_delete_user.__name__) # do_delete_user
此时do_delete_user.__name__
为do_delete_user.
4. 使用wrapt和decoractor
4.1. wrapt
4.2. decoractor
5. 延伸
5.1. 内置装饰器
5.2. 另类用法
0 0
- Python Decorator(装饰器)
- python decorator(装饰器)
- Python 装饰器/Decorator
- Python decorator(装饰器)
- 装饰器 decorator (python)
- Python装饰器 Decorator
- python 装饰器 decorator
- 【Python】装饰器 - Decorator
- python decorator装饰器
- python装饰器(decorator)
- Python 装饰器decorator
- python-装饰器Decorator
- Python Decorator装饰器
- python--装饰器(decorator)
- Python decorator装饰器
- Python 装饰器 decorator
- Python 装饰器(Decorator)
- python中的装饰器decorator
- 算法 图中求最小环路径 最小环个数 最大平均环 求简单无向图中环的个数
- 用postman调试接口跳过用户登陆的方式
- CSDN-markdown编辑器
- 《剑指Offer》 跳台阶
- long 和 int 的区别
- Python Decorator装饰器
- 树的重心
- Spring中如何装配Bean(一)
- 关于 iOS UITextView 的各种陨石坑 (一) !
- 关于函数返回局部变量的问题
- Go语言学习之ioutil包(The way to go)
- init.rc的使用
- cas4.2.x修改支持http协议
- matlab实现数组的累加求和