news 2026/5/10 23:09:27

Python 开发 - Python 装饰器(装饰器概述、函数概念、装饰器手动实现、装饰器语法糖实现)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 开发 - Python 装饰器(装饰器概述、函数概念、装饰器手动实现、装饰器语法糖实现)

一、装饰器概述

  1. 装饰器允许开发者在不修改原函数代码的情况下,给函数添加额外的功能

  2. 装饰器本质上是一个返回函数的高阶函数

  3. 在 Python 中,使用装饰器语法糖@可以便捷应用装饰器


二、函数概念

1、函数是一等对象
  1. 函数可以赋值给变量
defgreet(name):returnf"Hello,{name}"my_func=greetprint(my_func("Alice"))
# 输出结果 Hello, Alice
  1. 函数可以作为参数传递
defgreet(name):print(f"Hello,{name}")defcall_twice(func,arg):greet(arg)greet(arg)call_twice(greet,"Alice")
# 输出结果 Hello, Alice Hello, Alice
  1. 可以定义在另一个函数内部
defcall_twice(arg):defgreet(name):returnf"Hello,{name}"print(greet(arg)+" "+greet(arg))call_twice("Alice")
# 输出结果 Hello, Alice Hello, Alice
  1. 函数可以作为返回值
defget_func(flag):defadd(num1,num2):returnnum1+num2defsubtract(num1,num2):returnnum1-num2ifflag=="+":returnaddelifflag=="-":returnsubtract result_func=get_func("+")result=result_func(10,20)print(result)
# 输出结果 30
2、闭包
  • 闭包是嵌套函数中,内部函数引用外部函数的变量,即使外部函数已经执行完毕

  • 如下例,函数 inner_func 引用了外部函数的变量 x,即使函数 outer_func 已经执行完,函数 closure 仍能访问 x

defouter_func(x):definner_func(y):returnx+yreturninner_func closure=outer_func(10)result=closure(5)print(result)
# 输出结果 15

三、装饰器手动实现

  1. 基本实现
# 装饰器函数defmy_decorator(func):defwrapper():print("函数执行前")result=func()print("函数执行后")returnresultreturnwrapper# 原始函数defsay_hello():print("Hello")# 应用装饰器decorated_say_hello=my_decorator(say_hello)decorated_say_hello()
# 输出结果 函数执行前 Hello 函数执行后
  1. 函数带参数
# 装饰器函数defmy_decorator(func):defwrapper(**kwargs):print("函数执行前")result=func(**kwargs)print("函数执行后")returnresultreturnwrapper# 原始函数defsay_hello(name):print(f"Hello,{name}")# 应用装饰器decorated_say_hello=my_decorator(say_hello)decorated_say_hello(name="Alice")
# 输出结果 函数执行前 Hello, Alice 函数执行后
  1. 装饰器带参数
# 装饰器函数defmy_decorator(func,times):defwrapper():print("函数执行前")foriinrange(times):func()print("函数执行后")returnwrapper# 原始函数defsay_hello():print("Hello World")# 应用装饰器decorated_say_hello=my_decorator(say_hello,3)decorated_say_hello()
# 输出结果 函数执行前 Hello World Hello World Hello World 函数执行后

四、装饰器语法糖实现

  1. 基本实现
# 装饰器函数defmy_decorator(func):defwrapper():print("函数执行前")result=func()print("函数执行后")returnresultreturnwrapper# 应用装饰器@my_decoratordefsay_hello():print("Hello")say_hello()
# 输出结果 函数执行前 Hello 函数执行后
  1. 函数带参数
# 装饰器函数defmy_decorator(func):defwrapper(**kwargs):print("函数执行前")result=func(**kwargs)print("函数执行后")returnresultreturnwrapper# 应用装饰器@my_decoratordefsay_hello(name):print(f"Hello,{name}")say_hello(name="Alice")
# 输出结果 函数执行前 Hello, Alice 函数执行后
  1. 装饰器带参数
# 装饰器函数defmy_decorator(times):defdecorator(func):defwrapper():print("函数执行前")foriinrange(times):func()print("函数执行后")returnwrapperreturndecorator# 应用装饰器@my_decorator(times=3)defsay_hello():print("Hello World")say_hello()
# 输出结果 函数执行前 Hello World Hello World Hello World 函数执行后
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 5:48:02

RocketMQ 新手入门:10分钟搞定项目集成与基础使用

一、前置认知:为什么选 RocketMQ?(新手必懂) RocketMQ 是阿里开源的分布式消息队列,核心优势是高吞吐、高可用、易集成,能解决项目中的“解耦、削峰、异步通信”问题(比如订单下单后&#xff0…

作者头像 李华
网站建设 2026/4/29 11:59:01

IDEA提示Untrusted Server‘s certificate

如果你用的是Intellij系列IDE(GoLand, PHPStorm, WebStorm, IDEA),突然弹出个提示『Untrusted Servers certificate 』 莫慌,这是因为你用了破解版的 IDE,破解过程中有个hosts绑定的操作:0.0.0.0 account.j…

作者头像 李华
网站建设 2026/5/5 9:19:41

AI室内设计的终极革命:从静态空间到动态智能环境

AI室内设计技术正在重构传统家居空间的定义方式,通过深度学习模型实现从二维图像到三维智能环境的跨越式演进。智能家居系统的核心从设备控制转向空间重构,基于ControlNet架构的机器学习模型为个性化空间优化提供了技术基础。 【免费下载链接】roomGPT U…

作者头像 李华
网站建设 2026/5/10 20:01:13

40、Windows 8系统:注册表操作、版本特性与常用术语解析

Windows 8系统:注册表操作、版本特性与常用术语解析 1. 注册表操作指南 在Windows系统中,注册表是一个至关重要的数据库,它包含了系统、用户偏好以及已安装软件和硬件的设置信息。除了使用注册表编辑器外,还有多种方法可以对注册表进行操作: - 使用组策略和MMC :可以…

作者头像 李华