【Python基础】之装饰器

2023-05-16

             这是我初次接触装饰器,先从初学者的角度介绍装饰器,关于装饰器的应用场景举例,后面再补充。

1.装饰器的作用

  • 装饰器可以让一个函数在不做任何变动的情况下新增额外的功能。

如下代码,func_name函数是打印传入函数的函数名,f1函数就是打印一个字符串。

def func_name(func):
    """打印传入函数的函数名"""
    print(func.__name__)

def f1():
    print("这是待装饰的函数f1")

现在要求,每次调用一个函数的时候,都要打印该函数的函数名,那么我们可以在f1函数内部作如下修改:

def f1():
    func_name(f1)
    print("这是待装饰的函数")

f1() #f1 这是待装饰的函数

看似很简单,但是实际应用场景中可能有几十个函数需要作这样的修改,都在函数内部作改动是很麻烦的,也容易出错,那么我们可以利用装饰器在f1函数的外部进行修改。

2.写一个装饰器

如下代码就是对1中的f1函数作一个修改。可以看到我们定义了两个函数func_name和函数f1,其中我们用func_name函数装饰了函数f1。

那么在装饰的过程中,f1发生了怎么样的变化呢。首先我们要定义一个装饰器func_name,然后在待装饰的函数正上方输入@func_name(注意,这里是@+函数名,不带括号)。

当我们调用函数f1()时,一共发生了三件事,

  • 第一,执行func_name函数,并把@下面一行的函数名称(注意,不带括号,是函数名)传给func_name,这时func_name会返回函数名称wrap(注意,是函数名,不带括号),
  • 第二步,将func_name返回的函数名称wrap赋值给f1,即f1 = func_name(f1), 而func_name(f1)=wrap,所以这时,f1 = wrap(),
  • 第三步,执行f1()函数,即wrap()函数,但是现在wrap()中的func()函数还是原来传入func_name的f1函数。
def func_name(func):
    def wrap():
        print(func.__name__)
        func()
    return wrap

@func_name
def f1():
    print("这是待装饰的函数")

f1()# f1 这是待装饰的函数

3.带参数的装饰器

如果f1带参数呢?比如下方的f1,有一个参数args

def f1(args):
    print(args)
    print("这是待装饰的函数")

那么我们可以在装饰器中的wrap()和func()中也加入相同的参数。

def func_name(func):
    def wrap(args): #加入参数
        print(func.__name__)
        func(args) #加入参数
    return wrap

@func_name
def f1(args):
    print(args)
    print("这是待装饰的函数")

f1("我是参数")
"""
输出:
f1
我是参数
这是待装饰的函数
"""

但是如果我们需要用func_name装饰十几个函数,而十几个函数传入的参数格式、格式都不相同,怎么办呢?这时我们可以在wrap()和func()中传入动态参数*args, **kwargs,这样勿论待装饰的函数传入多少参数,装饰器都能够正确接受。

有关动态参数见:https://blog.csdn.net/lincoco49/article/details/89364034

def func_name(func):
    def wrap(*args, **kwargs):#动态参数
        print(func.__name__)
        func(*args, **kwargs) #动态参数
    return wrap


@func_name
def f1(args):#一个形参
    print(args)
    print("这是待装饰的函数")

@func_name
def f2(a, b): #两个形参
    ret = a+b
    print(ret)

f1("我是参数")
"""
f1
我是参数
这是待装饰的函数
"""

f2(1,1)
"""
f2
2
"""

4.写装饰器易错总结:

  • @后面跟的是函数名,不加括号
  • 装饰器返回的也是一个函数名,不加括号,加了括号就会执行函数了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python基础】之装饰器 的相关文章

随机推荐

  • 基于51单片机的智能温控风扇

    1 功能 本设计为一种温控风扇系统 xff0c 具有灵敏的温度感测和显示功能 xff0c 系统选用STC89C52单片机作为控制平台对风扇转速进行控制 可在测得温度值在高低温度之间时打开风扇弱风档 xff0c 当温度升高超过所设定的温度时自
  • 基于51单片机的数字频率计

    1 简介 数字频率计是现代科研生产中不可或缺的测量仪器 xff0c 它以十进制数显示被测频率 xff0c 基本功能是测量正弦信号 xff0c 方波信号 xff0c 及其它各种单位时间内变化的物理量 本系统采用AT89C52单片机智能控制 x
  • 基于51单片机的火灾报警器

    1 系统功能 火灾报警器 xff0c 主要检测温度和烟雾 xff0c 再通过单片机控制相应的报警和驱动负载 通过液晶显示当前的烟雾值和温度值 xff0c 通过按键设定相应的阀值 主要包括以下几项功能 xff1a 1 火情探测功能 xff1a
  • 基于51单片机的指纹密码锁

    1 系统功能概述 本次分享的是一款基于51单片机的指纹识别电子密码锁系统 xff0c 该系统以STC89C52单片机作为模块核心 xff0c 通过串口通信控制指纹模块AS608实现录取指纹并存储指纹数据 xff0c 并通过LCD12864液
  • 基于51单片机的智能电子秤

    1 概述 xff08 1 xff09 系统原理 本电子秤系统利用压力传感器采集因压力变化产生的电压信号 xff0c 经过电压放大电路放大 xff0c 然后再经过模数转换器转换为数字信号 xff0c 最后把数字信号送入单片机 单片机经过相应的
  • 基于51单片机的智能垃圾桶

    1 简介 本次主要是利用单片机设计并制作一套智能垃圾箱 要求以单片机为控制核心 xff0c 通过红外传感器检测是否有人扔垃圾 xff0c 并自动打开垃圾箱盖 xff0c 扔完垃圾后再自动关闭 主要内容包括 xff08 1 xff09 红外对
  • gmake: No rule to make target `C:/ti/controlSUITE2_DMC Rev/device_support/f2803x/v122/DSP2803x_h的解决

    注 xff1a 此方法是在CCS8环境下的使用成功的 在使用controlSUITE的例程编译时 xff0c 工程老出现这种错误 xff0c 排查了很久 xff0c 终于找到了原因 xff0c 造成这种原因主要是CCS在安装时没有按照默认的
  • 基于51单片机的数字气压计

    1 概述 本设计是基于MPX4115的数字气压计 xff0c 硬件处理电路为大气压传感器模拟信号的采集 转换 处理和显示 xff0c 并根据相应的软件需求设计控制程序 2 硬件设计 xff08 1 xff09 硬件总体框图 气压计的硬件主要
  • 一站式开源分布式集群云真机测试平台Sonic——基于Docker方式部署sonic前后端(体验版)

    Sonic xff1a 一站式开源分布式集群云真机测试平台 xff0c 致力服务于中小企业的客户端UI测试 xff0c 永久免费 sonic官网 xff1a Sonic 开源云真机测试平台 开源不易 xff0c 请大家多多支持作者 xff0
  • Policy Gradient Algorithms

    Policy Gradient Algorithms 2019 10 02 17 37 47 This blog is from https lilianweng github io lil log 2018 04 08 policy gr
  • 基于51单片机的多功能八路抢答器

    1 功能介绍 多功能八路抢答器是基于51单片机来设计的 xff0c 除了可以实现最基本功能 8路抢答外 xff0c 还具有自动处理犯规选手 xff0c 抢答时间调整 xff0c 还可以进行答题 xff0c 计分 xff0c 并且可以查询或修
  • 基于51单片机的贪吃蛇游戏

    1 简介 本设计为一款贪吃蛇游戏 xff0c 显示器采用8 8点阵 xff0c 主控制器采用51单片机 xff0c 并通过按键实现对游戏的操作 2 贪吃蛇算法介绍 吃蛇游戏算法的实现 xff0c 即如何通过液晶屏显示蛇的移动 其实蛇看似移动
  • 基于51单片机的便携式输液点滴控制报警器

    1 简介 基于单片机输液点滴控制报警器组成 该系统主要由光电传感器检测电路 键盘 数码管显示 报警提示电路 液滴流速监测电路 电机驱动电路等组成 利用光电感器测量出液滴流速 xff0c 并将将信息返回给单片机 xff0c 单片机对流速信号与
  • PCB加工文件—Gerber文件的导出

    当我们使用软件将一个板卡的PCB图纸设计好后 xff0c 想到PCB厂家制作成电路板 简单的 xff0c 你可以把自己的设置PCB文件 PcbDoc 直接发给厂家加工 xff0c 但是有些PCB厂家会要求你提供Gerber文件 但是这个Ge
  • AD13如何导出坐标文件

    在电子行业加工生产大批量的电路板 xff0c 都是利用贴片机进行生产和制造 xff0c 在生产之前 xff0c 我们需要提供PCB的坐标文件给贴片厂家 xff0c 这样厂家才能确定每个元器件应该贴在PCB板上什么位置 所以下面我们就来讲一下
  • 基于PID算法的水箱温度控制系统

    1 概述 本设计为基于STC89C52单片机的智能水温控制系统 xff0c 控制对象以500mL陶瓷水箱为容器 xff0c 并使用PID控制算法来调整水箱中500ml纯净水的温度 水温可以在一定范围内人为设定 xff0c 并能实现在下限温度
  • 基于51单片机的数字电流电压表

    1 简述 本文介绍了基于STC89C52单片机为核心 xff0c 分别以ACS712 05芯片和串联分压电路为为电流检测和电压检测电路 xff0c 并通过AD0809数模转换芯片对电压信号进行采集和转换 xff0c 传输给单片机进行处理 x
  • OpenStack快速入门

    一 登陆OpenStack 查看用户名和密码 查看文件 用户名admin和demo 登录 页面显示 修改密码 点击设置 gt 更改密码 创建和操作虚拟机实例 xff08 一 xff09 创建虚拟机实的前提 创建虚拟机实例的前提条件 1 实例
  • vnc view远程登录Linux

    转自http blog sina com cn s blog 49c306b201011had html 尽管我们可以使用 SSH连接远程通过字符界面来操作Linux xff0c 但是对于更多熟悉图形人来说是很不方便的 xff0c 因此开启
  • 【Python基础】之装饰器

    这是我初次接触装饰器 xff0c 先从初学者的角度介绍装饰器 xff0c 关于装饰器的应用场景举例 xff0c 后面再补充 1 装饰器的作用 装饰器可以让一个函数在不做任何变动的情况下新增额外的功能 如下代码 xff0c func name