python语法之叠加装饰器、有参装饰器
时间:2019-11-13
本文章向大家介绍python语法之叠加装饰器、有参装饰器,主要包括python语法之叠加装饰器、有参装饰器使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、叠加装饰器
定义:在同一个被装饰对象,添加多个装饰器,并执行。
叠加装饰器的装饰顺序与执行顺序
装饰顺序:由下往上装饰。
执行顺序:由上往下执行。
注意:装饰器在调用被装饰对象时才会执行添加功能。
def wrapper1(func): def inner1(*args,**kwargs): print('1') res = func(*args,**kwargs) print('2') return res return inner1 def wrapper2(func): def inner2(*args,**kwargs): print('3') res = func(*args,**kwargs) print('4') return res return inner2 def wrapper3(func): def inner3(*args,**kwargs): print('5') res = func(*args,**kwargs) print('6') return res return inner3 @wrapper1 #inner1 = wrapper1(inner2) @wrapper2 #inner2 = wrapper2(inner3) @wrapper3 #inner3 = wrapper3(foo) def foo(): print('from foo') foo()
二、有参装饰器
def wrapper(user): def outer(func): #func = foo def inner(*args,**kwargs): if user == 'f': print('welcome haha') #添加用户的功能 res = func(*args,**kwargs) #func() = foo() return res elif user == 'k': print('sorry neinei') #添加用户的功能 res = func(*args,**kwargs) #func() = foo() return res return inner return outer @wrapper("k") #outer = wrapper(foo) def foo(): #被装饰对象 print('from foo') foo()
三、wraps修复工具
#不导包的样子 # def wrapper(func): # def inner(*args,**kwargs): # ''' # 这是装饰器的注释 # :param args: # :param kwargs: # :return: # ''' # res = func(*args,**kwargs) # return res # return inner # @wrapper # def foo(): # ''' # 这是被装饰对象的注释 # :return: # ''' # print('from foo') # foo() # print(foo) #<function wrapper.<locals>.inner at 0x0000000009E352F0> 此时是装饰器的注释 #导包之后 from functools import wraps def wrapper(func): @wraps(func) #修改名称空间 foo--->func def inner(*args,**kwargs): ''' 这是装饰器的注释 :param args: :param kwargs: :return: ''' res = func(*args,**kwargs) return res return inner @wrapper def foo(): ''' 这是被装饰对象的注释 :return: ''' print('from foo') # foo() print(foo.__doc__)
原文地址:https://www.cnblogs.com/Cheryl-D/p/11851689.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- vue-element-admin 上传upload图片慢问题处理
- Centos8 下安装最新 OpenCV4.3
- Golang之rpc框架rpcx
- gin websocket 一对一聊天
- Go 中文和unicode字符之间转换
- Go 加密解密算法总结
- Linux 中几个正则表达式的用法
- embedded.AnnotationConfigEmbeddedWeb ApplicationContext@1e67b872 has been closed already
- Js实现list导出为excel表格
- 宿舍(寝室)管理系统设计与实现(SSM框架 附 详细系统搭建教程、系统演示地址、实现过程、源码)
- Redis get key error
- elastic search 日志不打印问题(root用户惹的祸)
- 起飞 | 应用YOLOV4 - DeepSort 实现目标跟踪
- 如何将elastic search 的健康状态由红色red变为绿色green
- 拥抱K8s系列-01