Python中装饰器超详细讲解,看不懂尽管来砍我!

2023-11-15

Python中装饰器的那些事儿…

说到装饰器,我们需要首先理解下闭包的概念,走起!
定义:具有执行环境的函数
满足三个条件:
1.外部函数中定义一个内部函数
2.内部函数中使用外部函数的局部变量
3.外部函数将内部函数作为返回值返回

此时的内部函数就叫闭包

怎么缩呢?来看个例子吧!(滑稽)

#先定义一个外部函数
def wai(n):
    #在外部函数中定义一个内部函数
    def nei():
    	# 内部函数中使用外部函数的局部变量
        return n * n
    #内部函数作为返回值
    return nei
    #对函数进行调用
    f1 = wai(10)
    f2 = nei(4)
    
   print(f1())
   print(f2())    

打印结果为:
在这里插入图片描述

下面进入正题:装饰器

装饰器

  • 作用:当需要改变一个函数原有的功能时,但是不想/不能改变原来的函数,可以通过装饰器解决

  • 使用:

    • 装饰器其实就是一个函数,该函数有一个参数(函数类型),返回一个闭包
    • 在返回的闭包中调用传递进来的函数,然后在调用函数的前后就可以添加内容
  • 示例:

    #定义一个装饰器(参数为一个函数)
    def zhuangshiqi(func):
        def wrapper():
            print('开始装饰')
            func()
            print('装饰结束')
    
        return wrapper
    
    
    @zhuangshiqi
    # 相当于执行了:test = zhuangshiqi(test)
    def test():
        print('for test')
        
    # t2 = zhuangshiqi(test)
    # t2()
    
    # test = zhuangshiqi(test)
    test()
    
    
    

执行结果为:

Python中的装饰器的分类:

def  cool(func):
    def wrapper():
        print('Vans卫衣')
        func()
        print('Air Jordan')
    return wrapper
 @cool
 #屌丝变高富帅
 def   diaosi():
      print("屌丝大变身?")
 diaosi()



装饰带参无返回值的函数
 def zhuangshiqi(func):
      def wrapper(*args, **kwargs):
          print('开始装饰')
          func(*args, **kwargs)
          print('装饰结束')
      return wrapper


  @zhuangshiqi
  def test(n):
      print('I like num {}'.format(n))


  test(250)

装饰有参有返回值的函数
def zhuangshiqi(func):
      def wrapper(*args, **kwargs):
          print('开始装饰')
          ret = func(*args, **kwargs)
          print(ret)
          print('装饰结束')
          return ret
      return wrapper


  @zhuangshiqi
  def add(a, b):
      return a + b


  print(add(3, 5))

关于Python中装饰器的讲解就讲到这里,希望能帮助到大家!
如果觉的还可以的话点个赞再走吧…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中装饰器超详细讲解,看不懂尽管来砍我! 的相关文章

随机推荐

  • linux信号介绍

    信号介绍 信号的概念 信号是信息的载体 Linux UNIX 环境下 古老 经典的通信方式 现下依然是主要的通信手段 信号在我们的生活中随处可见 例如 古代战争中摔杯为号 现代战争中的信号弹 体育比赛中使用的信号枪 信号的特点 简单 不能携
  • 【扩展KMP】POJ_3450| HDU_2328 Corporate Identity

    原题直通车 POJ 3450 Corporate Identity HDU 2328 Corporate Identity 题意概述 找出N个串中最长公共子串 分析 一 可以直接枚举其中一个串的所有字串 跟所有串进行匹配找到结果 二 用其中
  • IDEA(Ultimate版本)安装全程照着箭头指示

    只需动手跟着箭头指示安装即可 安装包的链接 https pan baidu com s 12hSGc7PDpbcaV UxCL5NSQ 提取码 zx1x 下载后解压自己想要的位置 安装完后可删除 以上就是安装全过程 如有问题可在评论区留言
  • 2023-05-19 题目

    1 java的三大特性 亦或者四大特性 继承 继承是从已有类得到继承信息创建新类的过程 提供继承信息的类被称为父类 超类 基类 得到继 承信息的类被称为子类 派生类 继承让变化中的软件系统有了一定的延续性 同时继承也是封装程序中可变因素的
  • <<计算机视觉CVPR>>2022:Grounded Language-Image Pre-training

    收录情况 CVPR 2022 论文链接 https arxiv org abs 2112 03857 代码链接 https github com microsoft GLIP 文章目录 简介 问题 方案 主要贡献 相关工作 方法 Groun
  • 12款开源或免费的3D建模软件

    1 Blender Blende是一款系统全面的3D建模套件 它提供了大量专业级功能和模块 跨平台支持所有的主要操作系统 目前并已成为免费3D软件的代名词 Blender通常被称为TheBlenderProject 因为它不仅仅是一个软件
  • Python 基础合集13:错误的调试和处理

    一 前言 本小节介绍了错误的调试和处理 包含了寻找出现bug的代码的方法 以及处理bug的方法 另外还附加了一些错误类型 环境说明 Python 3 6 windows11 64位 二 调试 找出错误 之前看到一句话 很在理 出错并不可怕
  • 汇编, 立即数, 有符号与无符号数

    汇编 立即数 有符号与无符号数 386 model flat stdcall option casemap none includelib msvcrt lib printf proto c ptr sbyte vararg data sz
  • C++语法总结

    1 const 与volatile 的用法 1 const include
  • 传统直线检测算法与基于深度学习的直线检测算法

    传统直线检测算法与基于深度学习的直线检测算法 提示 科大讯飞算法面试题 加入一个图像有一条很明显的直线划痕 怎么用传统图像处理去掉划痕 就是直线检测 文章目录 传统直线检测算法与基于深度学习的直线检测算法 TOC 文章目录 啥是直线检测 传
  • 【Python蓝桥杯】01字串 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是: 00000 00001 00010 00011 00100 请按从小到大的顺序输出

    最近在刷蓝桥杯题目 按题目做一下笔记整理 顺便分享交流一下 有更好的解决方案欢迎大家共同提出探讨 以下源代码为系统提交满分答案 01字串 问题描述 资源限制 Python时间限制 5 0s 问题描述 对于长度为5位的一个01串 每一位都可能
  • JS数据结构与算法知识点--->字典

    此数据结构算法知识点系列笔记均是看coderwhy老师视频整理得出 字典一般是基于哈希表 后续学习 实现 数组 字典 集合 是几乎编程语言都会默认提供的数据类型 特点 一 一对应的关系 使用字典的方式 可以通过key取出value 键值对
  • SolidWorks装配体中子装配体无法移动的问题

    SolidWorks装配体中子装配体无法移动的问题 问题描述 问题解决 问题描述 有时候在一个装配体中有一个子装配体 这个子装配体没有被完全定义 子装配体之间的零件是可以相互移动的 但是在装配体中子装配体中的零件不可以相互移动 如下图 问题
  • CAN总线的报文分析(三)

    系列文章目录 文章目录 系列文章目录 前言 一 数据帧 最常用 1 帧起始 2 仲裁段 3 控制段 4 数据段 5 CRC段 6 ACK段 7 帧结束 二 远程帧 三 错误帧 四 过载帧 五 帧间隔 总结 前言 CAN总线上的节点发送数据都
  • Python for 3dMax加载图像文件并读取像素值

    使用Python for 3dMax加载和显示图像文件的示例 在这种情况下 EXR图像文件与3dMax文件位于同一目录中 from MaxPlus import BitmapManager image file path r BG park
  • 【编程笔试】美团2021校招笔试-通用编程题第5场(附思路及C++代码)

    导览 练习地址 修改大小写 式子求值 争夺地盘 公司管理 总结 练习地址 点此前往练习 修改大小写 在小美的国家 任何一篇由英文字母组成的文章中 如果大小写字母的数量不相同会被认为文章不优雅 现在 小美写了一篇文章 并且交给小团来修改 小美
  • 爬虫小项目

    爬取同花顺官网中的数据 共四页 项目适合练手 最终保存在csv文件中 尚有缺点 先发出来 一起探讨 qq 2385455226 欢迎来访 import requests from lxml import html headers Accep
  • 光线追踪渲染实战(五):低差异序列与重要性采样,加速收敛!

    项目代码仓库 GitHub https github com AKGWSB EzRT gitee https gitee com AKGWSB EzRT 目录 前言 1 低差异序列介绍 2 sobol 序列及其实现 2 1 生成矩阵与递推式
  • 面试官:线程崩了,为什么不会导致 JVM 崩溃呢?如果是主线程呢?

    网上看到一个很有意思的美团面试题 为什么线程崩溃崩溃不会导致 JVM 崩溃 这个问题我看了不少回答 但发现都没答到根上 所以决定答一答 相信大家看完肯定会有收获 本文分以下几节来探讨 线程崩溃 进程一定会崩溃吗 进程是如何崩溃的 信号机制简
  • Python中装饰器超详细讲解,看不懂尽管来砍我!

    Python中装饰器的那些事儿 说到装饰器 我们需要首先理解下闭包的概念 走起 定义 具有执行环境的函数 满足三个条件 1 外部函数中定义一个内部函数 2 内部函数中使用外部函数的局部变量 3 外部函数将内部函数作为返回值返回 此时的内部函