一、方法对象与方法调用

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:自定义装饰器详解相关推荐

  1. python类装饰器详解-Python类装饰器实现方法详解

    本文实例讲述了Python类装饰器.分享给大家供大家参考,具体如下: 编写类装饰器 类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例. 单体类 ...

  2. python类装饰器详解-Python 装饰器详解

    开放封闭原则: 开放对扩展 封闭修改源代码 改变了人家调用方式 装饰器结构 """ 默认结构为三层!!!每层返回下一层内存地址就可以进行执行函数, 传参:语法糖中的传参可 ...

  3. python类装饰器详解-Python装饰器详解

    python的装饰器其实是一个语法糖,第一行是@跟着一个表达式:第二行必须以def或者class起始(亦即函数或者class的定义). python的装饰器,必须是可调用的对象,而且必须是可以以一个参 ...

  4. python函数装饰器详解_Python语言函数装饰器用法实例详解

    这篇文章主要介绍了Python语言函数装饰器用法,以实例形式较为详细的分析了Python函数装饰器的常见使用技巧,需要的朋友可以参考下,希望对大家学习Python语言有所帮助. 本文实例讲述了pyth ...

  5. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解

    我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...

  6. Python @property装饰器详解

    之前的文章中,我们探究了@后接某个自定义函数的用法,实际上,更常见.完备.简单的应用在于对@和python内置的函数进行结合:这可以避免造轮子的行为. 我们知道, Python 内置了3种函数装饰器, ...

  7. python类装饰器详解-python 中的装饰器详解

    装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...

  8. python类装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  9. python之装饰器详解

    这几天翻看python语法,看到装饰器这里着实卡了一阵,最初认为也就是个函数指针的用法,但仔细研究后发现,不止这么简单. 首先很多资料将装饰器定义为AOP的范畴,也就是Aspect Oriented ...

最新文章

  1. 修改exe图标,加入版本号
  2. 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
  3. 2018全球最佳品牌Top25:时代巨变的一个缩影
  4. 等值线在Google Map上的叠加Extent
  5. 简述基于EDA技术的FPGA设计
  6. SPI接口通信协议详解:SPI时序、2线、3线、4线SPI及4种常用工作模式
  7. idea redis 插件_Intellij IDEA 实用插件安利
  8. [高级]性能分析工具TraceView
  9. linux子进程中断信息码6,Linux入门学习——进程
  10. IPFS 相关开发资源汇总
  11. 2021-08-08 WPF控件专题 StackPanel 控件详解
  12. A review on the applications of programmable logic controllers (PLCs)
  13. image not loaded  try to open it externally to fix format problem
  14. 阿里云镜像服务 vpc地址 无法 pull
  15. 移除元素---2022/03/16
  16. 杰理之优化电脑长时间播放没声音【篇】
  17. dns劫持是什么意思?常见的劫持有哪些?
  18. 工具篇 之 iTerm 2 用户名修改(基于 iTerm 2 + oh-my-zsh)
  19. C语言指针进阶(1.一阶与二阶指针)
  20. 我的二十条择偶标准 [转]

热门文章

  1. C++: 有限元法 (FEM) 应用于线性两点 一个空间维度上的边界值问题 (附完整源码)
  2. 111 ajax获取数据jsrender显示数据
  3. 腾讯云人脸识别接口demo
  4. mybatis中的多表查询
  5. 香港电讯牌照申请介绍
  6. Pytorch中 permute / transpose 和 view / reshape, flatten函数
  7. 又上热搜!多所高校取消硕士新生奖学金
  8. 解决Win10系统电脑连上蓝牙耳机后,有线耳机连上外放问题
  9. ObjectArx与VS版本对应关系及AutoCAD R版本
  10. 【鲁班学院】设计模式—访问者(Visitor)模式