琢磨下python装饰器的例子

2023-11-08

首先得强调,python中的引用是无处不在的。

建议先看引文再回来琢磨例子


简单概括装饰器:

对象:

        装饰器名字:A

        任意函数名字:B

        装饰语句:

@A
B()

若执行函数B:

B()

则可理解为:带有@+A的语句可将函数B(被装饰函数)作为参数传入A(装饰器)中,令B指向A返回的引用地址,并执行该地址的函数(因为B后面加了括号,所以是函数调用)

此外,装饰器还可以嵌套使用


下面三个例子是我根据文末引文所改的例子,还参照了上课ppt

主要面向三个问题:多装饰器的执行顺序是咋样的?装饰器里面遇到return 怎么办?函数名与函数调用是一回事吗?

例子就不解释了,看完几乎就大致理解装饰器了。

例1


def before(func):
    def wrapper(*args, **kwargs):
        print("Before function called!")
        func(*args, **kwargs)#call func
    return wrapper


def after(func):
    def wrapper(*args, **kwargs):
        result = func
        print("After function called!")
        result(*args, **kwargs)#call func
    return wrapper


@before
@after
def test():
    print("3")

test()

调用test()的输出:

Before function called!
After function called!
3

例2


def before(func):
    def wrapper(*args, **kwargs):
        print("Before function called!")
        func(*args, **kwargs)#call func
    return wrapper


def after(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)#call func
        print("After function called!")
        return result
    return wrapper


@before
@after
def test():
    print("3")

test()

调用test()的输出:

Before function called!
3
After function called!

例3


def before(func):
    def wrapper(*args, **kwargs):
        print("Before function called!")
        result2 = func(*args, **kwargs)  # call func
        return result2(*args, **kwargs)
    return wrapper


def after(func):
    def wrapper(*args, **kwargs):
        result = func  # call func
        print("After function called!")
        return result

    return wrapper


@before
@after
def test():
    print("3")


test()

输出:

Before function called!
After function called!
3

References

 解决TypeError: 'NoneType' object is not callable_hardcodetest的博客-CSDN博客_nonetype object

 python装饰器详解_nudt_qxx的博客-CSDN博客_python装饰器

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

琢磨下python装饰器的例子 的相关文章

随机推荐

  • 在STM32CubeIDE中使用IAR编译器

    在STM32CubeIDE中使用IAR编译器 一 前言 IAR编译器的大名早有耳闻 但本人一直未深度使用 主要有以下三点原因 首先 它收费 因此笔者更倾向于使用免费的GCC工具链 其次 作为嵌入式开发来说 IAR封装了太多底层细节 要深入了
  • Android开发学习笔记:Service的简介和启动方式

    一 Service的简介 1 Service 介绍和作用 Service是Android系统中的四大组件之一 它是一种长生命周期的 没有可视化界面 运行于后台的一种服务程序 比如我们播放音乐的时候 有可能想边听音乐边干些其他事情 当退出播放
  • 什么是实体-联系图(ER图)

    实体 联系图 ER图 数据模型中包含3种相互关联的信息 数据对象 数据对象的属性及数据对象彼此间相互连接的关系 1 数据对象 数据对象是对软件必须理解的复合信息的抽象 所谓符合信息是指具有一系列不同性质或属性的事物 仅有单个值得事物 例如
  • 安天逆向教程——常用汇编语句

    一 汇编基础 二 条件分支 反汇编时更多关注这些条件分支 如果看懂这些条件分支 会对程序的大体逻辑有一个整体的了解 至于程序里面的细节 有时会省略掉 往往关键的跳转理解了甚至进行一点点的改动 就会使得程序发生翻天覆地的变化 三 栈和函数调用
  • PO模式-unittest

    PO模式是指将页面元素的定位以及元素的操作分离出来 测试用例脚本直接调用这些封装好的元素操作来组织测试用例 从而实现了测试用例脚本和元素定位 操作的分离 本文采用PO模式和unittest框架 对readmine系统执行了两条测试用例 文件
  • MATLAB三维绘图基础meshgrid函数的用法解析

    MATLAB三维绘图基础meshgrid函数的用法解析 MATLAB中meshgrid函数是用来生成网格的 函数用法是 X Y meshgrid x y 这种是最常用的一种用法 x和y分别是两个向量 使用示例 结果 A中的每个点对应的是x轴
  • STM32学习--中断

    这里写目录标题 什么是中断 中断的作用 中断的特点 STM32与中断 NVIC 中断通道 中断优先级 中断服务函数 SysTick中断 内核中断 SysTick中断函数 NVIC库函数 NVIC初始化函数 抢断优先级分组 USART使能中断
  • 博客是个好东西

    到底有么有必要写blog 从热情到荒废 最近几年老觉得个人写blog是个费时费力的事情 所以荒废了好长时间没有写blog了 加之CSDN那几年不思进取 博客搞得一塌糊涂 维护起来麻烦的很 所以更是转到博客园去了 但是 但是 随着工作的事情越
  • C# webBrowser

    webBrowser功能 10 屏蔽脚本错误 将WebBrowser控件ScriptErrorsSuppressed设置为True即可 webBrowser1 ScriptErrorsSuppressed true HtmlElementC
  • ubuntu制作开机自启动service

    我们在使用java时 常常需要把jar包设置为开机自启动 保证机器在断电重启后仍然能正常的执行jar提供的服务 在部署再ubuntu系统中的操作过程如下 1 上传jar到指定的路径下 如上传到 home test jarTest test
  • Markdown操作——代码块内如何添加代码块+如何引用代码块符号

    目录 例子 尝试 用途 例子 以引用Markdown的数学公式为例 预览 E mc 2 这是个数学公式 但是想打出源代码 比如说想介绍一下这个代码的使用 的时候却不知道该怎么操作了 其实有的人想到了 直接在外面再加上 那就可以了吧 备注 c
  • Mysql实战详解15:mysql错误Please use SHOW DDL to check it, and then recover or rollback it

    4644 129f3d45d0265000 100 64 106 105 3306 common counter ERR CODE TDDL 4644 ERR PENDING DDL JOB EXISTS Another DDL job 1
  • 重磅!中国网络空间安全协会发布《2020年中国网络安全产业统计报告》

    6月29日 中国网络空间安全协会 以下简称 协会 发布了 2020年中国网络安全产业统计报告 以下简称 报告 共有4000余人出席线上发布会 报告 对国内绝大多数具备网络安全技术和产品自有研发能力的网络安全企业进行了梳理 统计和分析 力图全
  • ASP.NET页面之间传值的五种常用方法

    1 使用QueryString变量 QueryString是一种非常简单的传值方式 他可以将传送的值显示在浏览器的地址栏中 如果是传递一个或多个安全性要求不高或是结构简单的数值时 可以使用这个方法 但是对于传递数组或对象的话 就不能用这个方
  • Linux下GDB中的 attach pid 如何使用?

    linux下使用gdb可以很好的跟踪代码 当然 让我觉得神奇的是它竟然能跟踪正在运行的进程 下面 我将用我的例子演示一下怎么使用的 第一步 获得正在运行的进程的进程号 ps ef grep lt 进程名 gt 我的就是 找到该进程的进程id
  • O(nlogn)在数组S中找存在相加可得到x的算法

    题目 设计一个运行时间为O nlogn 算法 给定n个整数的集合S和另一个整数x 该算法能确定S中是否存在两个和相加刚好为x 的元素 思想 O nlogn O n O nlogn O nlogn 就是快排的时间复杂度 O n 就是查找的时间
  • 因果推断学习笔记(一)

    在日常生活中 我们常常会用到因果推断 比如 你淋雨了 赶紧去洗澡 不然容易着凉 感冒 这里我们认为淋雨是感冒的因 通过原因 来推断可能得结果 我拉肚子了 可能是昨天海鲜吃多了 这里我们认为海鲜吃多了是拉肚子的因 并且通过拉肚子反推可能得原因
  • N皇后问题

    久闻N皇后问题在算法界的赫赫大名 今天晚上有空我也来试一下 ps 至于我的作业 哈哈哈 请读者自行领悟 一 问题描述 在n n格的棋盘上放置彼此不受攻击的n个皇后 按照国际象棋的规则 皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子 n
  • 工作组 文件服务器,工作组文件服务器

    工作组文件服务器 内容精选 换一换 媒体处理包括媒体素材的上传 下载 编目 节目转码和数据归档等工作 涉及音视频数据的存储 调用和管理 根据其业务特性对共享的文件系统有如下要求 媒体素材的视频码率高 文件规模大 要求文件系统容量大且易于扩展
  • 琢磨下python装饰器的例子

    首先得强调 python中的引用是无处不在的 建议先看引文再回来琢磨例子 简单概括装饰器 对象 装饰器名字 A 任意函数名字 B 装饰语句 A B 若执行函数B B 则可理解为 带有 A的语句可将函数B 被装饰函数 作为参数传入A 装饰器