python:自定义装饰器详解
一、方法对象与方法调用
def test():return 1+1print(test)
print(test())
运行结果:在这里插入代码片
理解装饰器首先要理解方法对象与方法调用,上面的示例中,test是一个方法对象,test()是方法的调用,在理解装饰器的过程中需要注意区分二者。
二、不带参数的装饰器@log1
2.1 代码
def log1(func):def log2(*args,**kwargs):print("enter function {}()".format(func.__name__))return func(*args,**kwargs)return log2@log1
def test(a):print("输入参数:",a)test("法外狂徒张三")
2.2 代码逻辑
这种装饰器有2层
2.2.1 理解装饰器外层方法
外层方法做了3件事:
1、log1接收参数,参数是被修饰的方法对象
2、log1定义了内层方法log2,注意,此处仅仅是定义log2
3、log1返回log2对象
2.2.2 调用被装饰后的方法
@log1
def test(a):print("输入参数:", a)
方法对象被装饰后:
被装饰的方法对象 相当于: 装饰器去掉@的部分(被装饰的方法对象)
test 此处相当于log1(test)
调用被装饰后的方法:
test("法外狂徒张三")
test(“法外狂徒张三”)相当于: log1(test)(“法外狂徒张三”)
分析:
log1(test)返回log2方法对象,test(“法外狂徒张三”)相当于: log1(test).log2(“法外狂徒张三”),即调用log2方法
2.2.4 理解log2方法的调用
log1(test).log2(“法外狂徒张三”):
1、接收用户输入的参数"法外狂徒张三"
2、执行print(“enter function {}()”.format(func.name))
3、调用原来的函数,test(“法外狂徒张三”),并返回结果
2.3运行结果
enter function test()
输入参数: 法外狂徒张三
三、带参数的装饰器@out(“哈哈”)
3.1 代码
def out(input_str):def log1(func):def log2(*args, **kwargs):print(input_str)print("enter function {}()".format(func.__name__))return func(*args, **kwargs)return log2return log1@out("哈哈")
def test(a):print("输入参数:", a)test("法外狂徒张三")
3.2 代码逻辑
这种装饰器有3层
3.2.1 理解装饰器外层方法
3.2.2 调用被装饰后的方法
被装饰的方法对象 相当于: 装饰器去掉@的部分(被装饰的方法对象)
@out("哈哈")
def test(a):print("输入参数:", a)
方法对象被装饰后:
test 相当于: out(“哈哈”)(test)
调用被装饰后的方法:
test("法外狂徒张三")
test(“法外狂徒张三”)相当于: out(“哈哈”)(test)(“法外狂徒张三”)
分析:
out(“哈哈”)返回log1方法对象,此处相当于: out(“哈哈”).log1(test)(“法外狂徒张三”)
log1(test)返回log2方法对象,此处相当于: out(“哈哈”).log1(test).log2(“法外狂徒张三”),即调用log2方法
执行print(input_str)
执行print(“enter function {}()”.format(func.name))
调用被装饰的函数,test(“法外狂徒张三”),并返回结果
3.3运行结果
python:自定义装饰器详解相关推荐
- python类装饰器详解-Python类装饰器实现方法详解
本文实例讲述了Python类装饰器.分享给大家供大家参考,具体如下: 编写类装饰器 类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例. 单体类 ...
- python类装饰器详解-Python 装饰器详解
开放封闭原则: 开放对扩展 封闭修改源代码 改变了人家调用方式 装饰器结构 """ 默认结构为三层!!!每层返回下一层内存地址就可以进行执行函数, 传参:语法糖中的传参可 ...
- python类装饰器详解-Python装饰器详解
python的装饰器其实是一个语法糖,第一行是@跟着一个表达式:第二行必须以def或者class起始(亦即函数或者class的定义). python的装饰器,必须是可调用的对象,而且必须是可以以一个参 ...
- python函数装饰器详解_Python语言函数装饰器用法实例详解
这篇文章主要介绍了Python语言函数装饰器用法,以实例形式较为详细的分析了Python函数装饰器的常见使用技巧,需要的朋友可以参考下,希望对大家学习Python语言有所帮助. 本文实例讲述了pyth ...
- python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解
我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...
- Python @property装饰器详解
之前的文章中,我们探究了@后接某个自定义函数的用法,实际上,更常见.完备.简单的应用在于对@和python内置的函数进行结合:这可以避免造轮子的行为. 我们知道, Python 内置了3种函数装饰器, ...
- python类装饰器详解-python 中的装饰器详解
装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...
- python类装饰器详解-Python装饰器基础概念与用法详解
本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...
- python之装饰器详解
这几天翻看python语法,看到装饰器这里着实卡了一阵,最初认为也就是个函数指针的用法,但仔细研究后发现,不止这么简单. 首先很多资料将装饰器定义为AOP的范畴,也就是Aspect Oriented ...
最新文章
- 修改exe图标,加入版本号
- 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
- 2018全球最佳品牌Top25:时代巨变的一个缩影
- 等值线在Google Map上的叠加Extent
- 简述基于EDA技术的FPGA设计
- SPI接口通信协议详解:SPI时序、2线、3线、4线SPI及4种常用工作模式
- idea redis 插件_Intellij IDEA 实用插件安利
- [高级]性能分析工具TraceView
- linux子进程中断信息码6,Linux入门学习——进程
- IPFS 相关开发资源汇总
- 2021-08-08 WPF控件专题 StackPanel 控件详解
- A review on the applications of programmable logic controllers (PLCs)
- image not loaded try to open it externally to fix format problem
- 阿里云镜像服务 vpc地址 无法 pull
- 移除元素---2022/03/16
- 杰理之优化电脑长时间播放没声音【篇】
- dns劫持是什么意思?常见的劫持有哪些?
- 工具篇 之 iTerm 2 用户名修改(基于 iTerm 2 + oh-my-zsh)
- C语言指针进阶(1.一阶与二阶指针)
- 我的二十条择偶标准 [转]
热门文章
- C++: 有限元法 (FEM) 应用于线性两点 一个空间维度上的边界值问题 (附完整源码)
- 111 ajax获取数据jsrender显示数据
- 腾讯云人脸识别接口demo
- mybatis中的多表查询
- 香港电讯牌照申请介绍
- Pytorch中 permute / transpose 和 view / reshape, flatten函数
- 又上热搜!多所高校取消硕士新生奖学金
- 解决Win10系统电脑连上蓝牙耳机后,有线耳机连上外放问题
- ObjectArx与VS版本对应关系及AutoCAD R版本
- 【鲁班学院】设计模式—访问者(Visitor)模式