Python3 装饰器
来源:互联网 发布:一人能开几个淘宝店 编辑:程序博客网 时间:2024/06/07 22:02
原文: http://blog.csdn.net/Rozol/article/details/71189345
#!/usr/bin/env python# coding=utf-8__author__ = 'Luzhuo'__date__ = '2017/5/4'# decorator.py 装饰器# 装饰器: 本质是函数, 用于装饰其他函数, 附加一些本身所没有的功能# 函数就是变量def num(): print("num")num()num = 1 # 函数就是变量# num() # num的引用被指向1,不能再调用# ========================================# 高阶函数def func_1(): print("func_1")def func_2(func): # 接收函数变量 func()func_2(func_1) # => func_1# ========================================# 闭包def func_3(line): # 闭包: 用于代码封装 和 复用 def comp(value): # 嵌套函数: 函数里再嵌套一个函数 # 函数set_line执行完(生命周期结束), 自由变量(line)仍存活于包裹内 if value >= line: print("{} >= {}".format(value, line)) else: print("{} < {}".format(value, line)) return compf = func_3(60) # 调用函数A(set_line()),返回函数B(cmp()),这个函数B就叫闭包f(89) # => 89 >= 60f(59) # => 59 < 60# ========================================# 装饰器, 在不修改my_average()代码的情况下,为其添加了一些功能(wrapper())def dec_1(func): def wrapper(num1, num2): # --- 附加功能 --- if num2 == 0: print("num2 值不能为0") return func(num1, num2) return wrapper# 普通调用方式def average_1(num1, num2): return num1 / num2average_1 = dec_1(average_1)print(average_1(5, 3)) # => 1.6666666666666667# 使用@语法糖的方式@dec_1 # (sum = dec(sum))def sum_1(num1, num2): return num1 + num2print(sum_1(5, 3)) # => 8# ========================================# 能接收任何参数的通用装饰器def dec_2(func): def wrapper(*arg, **kwargs): # --- 附加功能 --- print("loging i ...") return func(*arg, **kwargs) return wrapper@dec_2def average_2(num1, num2): return num1 / num2print(average_2(5, 3)) # => loging i ... => 1.6666666666666667@dec_2def sum_2(*args): return sum(args)print(sum_2(5, 3, 2, 1)) # => loging i ... => 11# ========================================# 能接收不同参数的装饰器def auth(auth_type): # 在外面套一层 def dec_3(func): def wrapper(*arg, **kwargs): # --- 附加功能 --- if auth_type == "admin": print("你是管理员") elif auth_type == "user": print("你是普通用户") else: print("你是外星人吗?") return func(*arg, **kwargs) return wrapper return dec_3# 普通调用方式@auth(auth_type="admin")def average_3(*arg): return sum(arg) / len(arg)print(average_3(1, 2, 3, 4, 5)) # => 你是管理员 => 3.0@auth(auth_type="user")def sum_3(*arg): return sum(arg)print(sum_3(5, 3, 2, 1)) # => 你是普通用户 => 11# ========================================# 使用多个装饰器@dec_1@dec_2@auth(auth_type="admin")def average_2(num1, num2): return num1 / num2# 执行顺序dec_1 => dec_2 => auth => average_2print(average_2(5, 3)) # => loging i ... => 你是管理员 => 1.6666666666666667
阅读全文
0 0
- python3 装饰器
- Python3 装饰器
- Python3之装饰器
- python3 核心 装饰器
- python3 装饰器
- Python3 装饰器
- Python3 装饰器
- python3.3 装饰器日志
- python3学习笔记:装饰器
- Python3 基础:装饰器和偏函数
- Python3学习(17)--装饰器decorator
- 解除装饰器作用(python3新增)
- Python3学习(24)--内置装饰器@property
- Python3.5——装饰器之案例剖析
- python3.5函数的参数样式种类以及装饰器
- python 9-3 如何定义带参数的装饰器,提取函数签名python3 inspect.signature()
- Python3.5——装饰器及应用详解(上)
- Python3.5——装饰器及应用详解(下)
- JavaNIO学习之FileChannel
- Spring基础部分(ioc,aop,事物)
- C++之全局函数与成员函数的转换
- 一道关于竞赛图的题目
- netty in action.pdf 英文原版 免费下载
- Python3 装饰器
- UDP切包发送。避免发送内容大于MTU
- 安装RabbitMQ及使用方法
- win7中cookie存放的位置以及如何查看
- java使用pd4ml将html转换成pdf
- 《C++ 多态篇 imooc》笔记
- Thumbnailator使用简介
- 阻塞非阻塞与同步异步
- jQuery easyUI分页的实现