当前位置: 首页 > news >正文

学习笔记|decorator 装饰器是什么?

学习链接:https://www.bilibili.com/video/BV1Gu411Q7JV/

文章目录

  • 1. 函数
    • 1.1 函数是一个对象
    • 1.2 函数可以被当成参数传进其他函数里
    • 1.3 函数可以被当作一个返回值
  • 2. decorator (装饰器)
    • 2.1 decorator is callable (可调用的),可以理解为decorator本身是一个函数,@后面跟的是一个函数名
    • 2.2 decorator 输入是函数,输出不一定是函数
    • 2.3 例1:decorator 用在一个参数
    • 2.4 例2
    • 2.5 例3: decorator 用在多个参数——*args, **kwargs 参数
    • 2.6 带参数的 decorator
    • 2.7 例4: 带参数的 decorator

1. 函数

1.1 函数是一个对象

新建变量,变量里保存一个函数对象
在这里插入图片描述

1.2 函数可以被当成参数传进其他函数里

在这里插入图片描述

1.3 函数可以被当作一个返回值

在这里插入图片描述

2. decorator (装饰器)

2.1 decorator is callable (可调用的),可以理解为decorator本身是一个函数,@后面跟的是一个函数名

在这里插入图片描述

2.2 decorator 输入是函数,输出不一定是函数

在这里插入图片描述

2.3 例1:decorator 用在一个参数

在这里插入图片描述
思路:
my_func(1)
= timeit( myfunc ) (1)
= wrapper(1)
= {start = time.time(); ret = myfunc(1); print(time.time() - start); return ret}
= {print(time.time() - start); return myfunc(1)}
= 计算时间 (myfunc(1) 没有 print 所以不显示数值)

2.4 例2

在这里插入图片描述
思路:
other_func(2)
=timeit(other_func)(2)
= {start=time.time(); ret=other_func(2); print(time.time()-start); return ret}
= {4+计算时间; return other_func(2)}
print(other_func(2))
= {计算时间; return other_func(2)=2*2=4}
={{计算时间; 4}

2.5 例3: decorator 用在多个参数——*args, **kwargs 参数

在这里插入图片描述
思路:
add(2,3)
=timeit(add)(2,3)
= wrapper(2,3)
= {start=time.time(); ret=add(2,3)=2+3=5; print(time.time()-start); return ret}
= {计算时间; add(2,3)}
print(add(2,3))
={计算时间; add(2,3)=2+3=5}
={计算时间; 5}

2.6 带参数的 decorator

在这里插入图片描述

2.7 例4: 带参数的 decorator

在这里插入图片描述
思路:
第17行:
@timeit(1000) def double(x): return x*2
= @inner def double(x): return x*2
第21行:
double(2)=inner(double)(2)
= wrapper(2)
= {start=time.time(); for _ in range(1000): ret=double(2);print(time.time()-start); return ret}
= {print(time.time()-start); return double(2)}
= 计算时间 (ret 没有打印,所以没有出现)

http://www.dtcms.com/a/326144.html

相关文章:

  • 2025-8-11-C++ 学习 暴力枚举(2)
  • 【Linux文件操作】文件操作系统调用
  • [激光原理与应用-231]:光学 - 光学的主要分支、研究对象、应用场合与职业方向(几何光学、物理光学、量子光学、集成光学、非线性光学制造工艺、光学系统设计)
  • 左子树之和
  • 解锁AI性能密码:RAG和智能体评估指标的终极指南
  • 简单的身份验证中间件Tinyauth
  • Day43--动态规划--674. 最长连续递增序列,300. 最长递增子序列,718. 最长重复子数组
  • 算力板卡:AI时代的“算力心脏”
  • 指针和引用的区别
  • SQL中BETWEEN与IN的差异详解
  • Mybatis学习之缓存(九)
  • BM25算法记忆
  • 推荐中的在线学习
  • macos彻底删除vscode
  • Spring JDBC
  • 零基础AI编程开发微信小程序赚流量主广告实战
  • 6s081实验1
  • redis(2)-java客户端使用(IDEA基于springboot)
  • USB 基本描述符
  • Go 多进程编程-管道
  • C++方向知识汇总(三)
  • 面试实战 问题二十三 如何判断索引是否生效,什么样的sql会导致索引失效
  • git:分支
  • 3Ds Max的魔改利器:RailClone - 程序化建模的革命者
  • MySQL 经典练习 50 题(完美解答版,提供解题思路)
  • Spring Framework源码解析——DisposableBean
  • Oracle数据库中的Library cache lock和pin介绍
  • Java多线程并发控制:使用ReentrantLock实现生产者-消费者模型
  • js异步操作 Promise :fetch API 带来的网络请求变革—仙盟创梦IDE
  • 机器翻译:Bahdanau注意力和Luong注意力详解