python中的装饰器讲解

python装饰器底层原理讲解 文章目录1 python装饰器的作用2 python装饰器的原理3 python装饰器的实现3.1 最简陋的装饰器4 python装饰器在自动化测试框架中的应用从一个需求开始 1 python装饰器的作用 被装饰对象获得了更强大的功能 2 python装饰器的原理 python装饰器本身是一个函数 这个函数的参数是一个函数对象 这个函数的返回值也是一个函数对象,这个函数的功能更强大 python装饰器是python的一个语法糖(更简便的语法) 3 python装饰器的实现 3.1 最简陋的装饰器 ''' 阅读详情
def fn():
    print(f'fn函数被执行')
    return 0


def fn1(a):
    print(f'fn1函数被执行:a={a}')
    return a


def fn2(a, b):
    print(f'fn2函数被执行:a={a},b={b}')
    return a + b


def fn3(a, b, c=1):
    print(f'fn3函数被执行:a={a},b={b},c={c}')
    return a + b + c

装饰器函数

def begin_end(old):
    '''
        用来对其他函数进行扩展,使其他函数可以在执行前打印开始执行,执行后打印执行结束
        :param old: 要扩展的函数对象
        :return:
    '''

    # 创建一个新函数
    def new_function(*args, **kwargs):
        '''
        :param args: 用来接收位置参数,存到元组中
        :param kwargs: 用来接收关键字参数,存到字典中
        :return:
        '''
        print('开始执行~~~~')
        # 调用被扩展的函数
        result = old(*args, **kwargs)  # 这里的*args,将元组解包,使元素赋值给位置形参。**kwargs,将字典解包,使元素赋值给关键字形参
        print('执行结束~~~~')
        return result

    # 返回新函数
    return new_function

调用测试

# f = begin_end(fn1)
# print(f)
# f = begin_end(fn1)
# print(f)
# 上述打印的两个f的地址是不一样的,说明每次返回的都是一个新函数对象

# 第一种使用装饰器函数的方式,这种不常用
# f = begin_end(fn)
# print(f())
# f = begin_end(fn1)
# print(f(1))
# f = begin_end(fn2)
# print(f(1, 2))
# f = begin_end(fn3)
# print(f(1, 2, 3))

# 第二种使用装饰器函数的方式
# 加这个注解的作用等同上面的先调begin_end,然后再执行返回的函数对象
@begin_end
def fn4(a, b):
    print("执行fn4函数~~~~~")
    return a + b


print(fn4(3, 5))  # 等同于执行了print(new_function(3,5))

像 begin_end()这种函数我们就称它为装饰器
通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
在开发中,我们都是通过装饰器来扩展函数的功能的
在定义函数时,可以通过@装饰器,来使用指定的装饰器,来装饰当前的函数
可以同时为一个函数指定多个装饰器,这样函数将会按照从内向外的顺序被装饰

# 再定义一个装饰器
def fn5(old):
    '''
        用来对其他函数进行扩展,使其他函数可以在执行前打印开始执行,执行后打印执行结束
        :param old: 要扩展的函数对象
        :return:
    '''

    # 创建一个新函数
    def new_function(*args, **kwargs):
        '''
        :param args: 用来接收位置参数,存到元组中
        :param kwargs: 用来接收关键字参数,存到字典中
        :return:
        '''
        print('fn5 装饰 开始执行~~~~')
        # 调用被扩展的函数
        result = old(*args, **kwargs)  # 这里的*args,将元组解包,使元素赋值给位置形参。**kwargs,将字典解包,使元素赋值给关键字形参
        print('fn5 装饰 执行结束~~~~')
        return result

    # 返回新函数
    return new_function

调用测试

@fn5
@begin_end
def say_hello():
    print('大家好~~~')


say_hello()

执行结果

fn5 装饰 开始执行~~~~
开始执行~~~~
大家好~~~
执行结束~~~~
fn5 装饰 执行结束~~~~

将两个@装饰器的位置换一下

@begin_end
@fn5
def say_hello():
    print('大家好~~~')


say_hello()

执行结果

开始执行~~~~
fn5 装饰 开始执行~~~~
大家好~~~
fn5 装饰 执行结束~~~~
执行结束~~~~

说明:可以同时为一个函数指定多个装饰器,这样函数将会按照从内向外的顺序被装饰

python 装饰器的类型提示讲解 本文详细讲解了Python中装饰器的类型提示实现方法,主要内容包括:1)基础无参数装饰器使用ParamSpec和TypeVar保留函数签名;2)带参数装饰器的三层嵌套结构;3)类装饰器保留原始类类型;4)使用functools.wraps保留元信息;5)泛型装饰器处理多种返回类型。关键点在于正确使用类型变量捕获参数和返回类型,保持装饰器与被装饰对象间的类型一致性,同时确保Python静态类型检查器能正确推断原始签名(需要Python 3.10+或typing_extensions包)。这些方法能提升代码可读 阅读详情

相关推荐

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 281

Python @property 装饰器讲解

property() 函数 与 @property 装饰器讲解

小皇鱼-的-博客 4702

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月13日-安全配置-准备工作

请遵循本规程将SABRE 3D/3DxT/3D Scimitar系统设置为安全配置,以便能够在电镀单元、APT模块、XMM(或SRD)模块、工厂接口(FI)外壳或中央通道内部及周边区域执行作业p104-p117。在生产过程中暂停调度程序存在一定风险:若待维护模块未离线且在其他模块完成处理前重启调度程序,可能对生产晶圆造成影响。维护人员需特别注意电镀模块内的晶圆状态,并尽可能快速地恢复调度程序。确认待维护模块内无晶圆滞留暂停调度程序并将相应模块设置为离线状态打开模块检修门并关闭安全盖板(槽位)

weixin_46735260的博客 1367

python装饰器讲解

待留

Major_S的博客 297

总结目前开源的视频生成/视频编辑大模型

随着Sora的爆火,视频生成和视频编辑受到了越来越多的关注。这篇博客总结一下目前开源的视频生成和视频编辑的大模型,并分析他们各自的优缺点,以及在自己进行科研任务或者工作中应该如何选用对应的开源模型,希望能给从事这一领域研究和使用的小伙伴们帮助。

沉迷单车的追风少年 3542

boost::circular_buffer缓行缓冲区

1、circular_buffer实现了一个环形缓冲区,空间大小是固定的,当到达容器末尾时,将自动利用容器另一端的位置空间。 2、当程序需要容纳大量的元素,但多数情况下仅保存较少数量元素时可以使用circular_buffer_space_optimized,他可以有效的减少内存的占用,提高程序的运行效率。 3、主要接口: 4、实现一个生产者---消费者模式示例: #inc...

小米的修行之路 791

java装饰器python装饰器,python装饰器代码深入讲解

python装饰器就是用于扩展原函数功能的一种函数,这个函数特殊的地方就是它的返回值也是一个函数,使用Python装饰器的一个好处就是:在不需要修改原函数代码的情况下,给函数增加新的功能。先来看个例子:def say():print('Nice day')say()# 这个函数的输出为:Nice day现在,我想在输出Nice day的前面再打印一行****************,类似下面的效果...

weixin_39927799的博客 281

Windows窗口编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint等函数详解

Windows窗口编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint等函数详解

dvlinker的技术专栏 7165

超详细Python装饰器函数讲解 | 从此不再遗忘

装饰器函数(wrapper)是Python的一个非常强大的特性,笔者在初次学习时认为这种特性过于无关紧要,甚至对于这种脱裤子放屁的行为感到匪夷所思(还是太年轻了hh),而后续在学习flask以及其他高阶Python技能的过程中发现经常使用到,从而每次遇见装饰器不是苦不堪言就是即将苦不堪言。因此,决定写下这篇文章,以一种通俗的方式帮助理解,从此彻底克服装饰器恐惧症~初次看到装饰器这个词时,你可能会有疑问:什么是装饰器?为什么要用装饰器?

oxk39894的博客 1394

移植Google Gemini Nano到RK3588 NPU,实现高效边缘推理

在嵌入式 AI 开发中,大家常常会遇到模型在硬件平台上运行时出现性能瓶颈的问题,比如推理速度慢、功耗过高,这严重影响了应用的实时性和稳定性 ,导致性能瓶颈,无法满足如智能安防、工业检测等场景的实时性需求。为了解决这些问题,我们可以将轻量模型移植到具有强大算力的硬件平台上。本文将手把手教你将 Google Gemini Nano(或类似轻量模型)移植到 RK3588 NPU,充分发挥 RK3588 NPU 的 6Tops 算力,实现高效的模型推理,提升嵌入式系统的 AI 处理能力。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 293

药物吸收仿真软件:Caco-2_(9).Caco-2模型在药物开发中的案例分析

通过以上五个案例,我们可以看到Caco-2模型在药物开发中的重要作用。它不仅能够帮助我们预测药物的肠道吸收情况,还能够用于优化药物配方、评估代谢稳定性、研究药物相互作用以及转运蛋白的影响。这些体外实验和仿真分析的结果为药物的进一步临床研究提供了重要的参考依据,有助于缩短药物开发周期,提高研发效率。

kkchenjj的博客 863

通俗讲解Python的装饰器

print("执行前的操作") # 装饰器添加的功能func() # 调用原函数print("执行后的操作") # 装饰器添加的功能装饰器就是一个包装函数,它在原函数的外部,允许在不修改原函数的情况下增加额外的功能。使用@decorator语法可以方便地应用装饰器。装饰器的核心原理是函数作为参数和返回函数的机制。通过这种方式,装饰器不仅能让你的代码更具可读性,还能使其更加灵活和可复用。

weixin_44872675的博客 501

【知识分享】高速印刷电路板(PCB)寄生参数计算指南

对于高速PCB设计而言,寄生参数一直是令人讨厌的问题,它们会悄悄潜入PCB并在电路中造成严重的破坏,具体来说,它们是渗透到高速电路中的隐藏杂散电容器和电感器,包括由封装引线和长走线形成的电感器、PCB焊盘对金属平面形成的电容器、走线之间形成的电容器等等。

一只豌豆象的博客 1780

Python的装饰器讲解小白可看

Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello(): print "hello!" def say_goodbye(): print "hello!" # bug here if __name__ == '__main__': say_hello() say_goodbye() 但

m0_58520183的博客 212

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python装饰器-如何更通俗地讲解Python的装饰器?

我从以下几点,由浅入深详细讲解一下Python装饰器:什么是装饰器?为什么用装饰器?在哪里用装饰器?然后以示例+讲解相结合的方式阐述,同时会讲解一些在很多教程和书籍中不会涉及到的内容。什么是Python装饰器?顾名思义,从字面意思就可以理解,它是用来"装饰"Python的工具,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就是一个函数,...

weixin_37988176的博客 104

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

还是用代码讲解一下Python的装饰器

Python语言的一大特性

cjl30804的博客 330

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python之装饰器(详细讲解)

1.装饰器的基础使用 1.1 概念理解 python装饰器就是为原函数拓展新功能的函数,在不改变原函数名(或类名)的情况下,给函数增加新的功能. python装饰器的特殊之处是他的返回值也是一个函数,这个函数是内嵌原函数的函数. 1.2 装饰器的基本实现 def kuozhan(func): #为原函数拓展新功能的函数=>装饰器 def newfunc(): print("将...

weixin_45163798的博客 557

Python装饰器的类型提示讲解

装饰器的类型提示需要准确描述其输入和输出类型,特别是保留原始函数的签名信息。

2301_78096295的博客 792

如何更通俗地讲解Python的装饰器?

小白只需一篇文章就能看懂Python装饰器的作用

橙的博客 212

Python装饰器 - 具体讲解

Python装饰器是一种非常有用的功能,它允许我们以不修改原有函数代码的方式,扩展或增强函数的行为。装饰器本质上是一个函数,它接收一个函数作为参数并返回一个新的函数。下面我将详细讲解Python装饰器的概念、用法和实现。

糖醋_诗酒 371

python装饰器的讲解

装饰器的概念 装饰器其实就是闭包,它的作用是在不改变源代码的情况下,在一个函数的基础上增加新的功能,使用场景特别多。 当我们写一个闭包增加函数的时候,如下: 在func1的函数功能上增加一个,打印当前时间的函数 import datetime def show_now_time(func): def f1(*args, **kwargs): func(*args, **kwargs) print("当前时间:",datetime.datetime.now())

qq_42025868的博客 469

Python中的装饰器实例讲解

创建装饰器, 要求如下: 创建add_log装饰器, 被装饰的函数打印日志信息; 日志格式为: [字符串时间] 函数名: xxx, 运行时间:xxx, 运行返回值结果:xxx 代码: 结果: 多个装饰器的应用场景: 会采用多个装饰器先验证是否登陆成功 再验证权限是否足够 ...

CapejasmineY的博客 289

python --装饰器通俗讲解

装饰器 什么是装饰器?:在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上 Python中的装饰器是你进入Python大门的一道坎; 装饰器特点: 不改变原函数原代码; 不改变原函数调用方式; 给原函数增添新的功能; 示例: def deco(func): def wrapper(*args,**kwargs): print ("...

weixin_30466039的博客 96

Python装饰器详解(保姆级讲解)

python装饰器的保姆级教学

Jeaosn2332的博客 356

python中高阶函数和装饰器_Python高阶函数与装饰器函数的深入讲解

本文主要介绍的是Python高阶函数与装饰器函数的相关内容,分享给大家,下面话不多说了,来一起看看详细的介绍吧高阶函数1、可以使用函数对象作为参数的函数 2、或可以将函数作为返回值的函数 3、函数对象:定义好的函数,使用函数名调用(不要加括号)#将函数作为参数的高阶函数,通过传入不同的函数,可以使执行的结果不同4、内置高阶函数(1)map数据映射函数map函数接收的是两个参数,一个函数,一个序列,...

weixin_39955351的博客 155

python内置的装饰器最通俗的讲解_如何最简单、通俗地理解Python的装饰器?

装饰器是python里的一个非常有意思的部分,他用于封装函数代码,显式的将封装器应用到被封装的函数上,从而使得他们选择加入到装饰器指定的功能中。对于在函数运行前处理常见前置条件(例如确认授权),或在函数运行后确保清理(输出清除或异常处理),装饰器都非常有用。是不是感觉听不明白,太绕了!简单来说,装饰器就是实现了一个通用的功能,然后将这个通用的功能应用到不同的、需要使用这个功能的函数上,从而避免每次...

weixin_31976493的博客 98
上一篇: python中的高阶函数讲解
下一篇: python中的类和对象的讲解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值