Python入门:Python3 装饰器全面学习教程
Python入门:Python3 装饰器全面学习教程
Python入门:Python3 装饰器全面学习教程,本文全面介绍Python装饰器,从核心概念到实战应用。装饰器是接收函数或类并返回新函数或修改后类的函数,可动态扩展功能,语法为
@decorator_name
。文中讲解函数装饰器基础、带参数及自身带参数的情况,还介绍类装饰器的两种形式及应用。同时说明了@staticmethod
等内置装饰器,以及多个装饰器的堆叠使用,最后总结了装饰器在日志记录等场景的应用,帮助读者掌握这一灵活特性。
前言
Python作为一门简洁、易读、功能强大的编程语言,其基础语法是入门学习的核心。掌握好基础语法,能为后续的编程实践打下坚实的基础。本文将全面讲解Python3的基础语法知识,适合编程初学者系统学习。Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。
🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核心基础:变量、数据类型、流程控制、函数、文件操作及常用库入门。通过清晰示例与实用小项目,助你快速掌握编程思维,打下坚实根基,迈出自动化办公、数据分析或Web开发的第一步。
🥇 点击进入Python小游戏实战专栏, 寓教于乐,用Python亲手打造经典小游戏!本专栏通过开发贪吃蛇、飞机大战、猜数字、简易版俄罗斯方块等趣味项目,在实践中掌握Python核心语法、面向对象编程、事件处理、图形界面(如Pygame)等关键技能,将枯燥的代码学习转化为可见的成果,让学习编程充满乐趣与成就感,快速提升实战能力。
🥇 点击进入Python小工具实战专栏,告别重复劳动,用Python打造效率神器!本专栏教你开发文件批量处理、自动邮件通知、简易爬虫、桌面提醒、密码生成器、天气查询等实用小工具。聚焦os、shutil、requests、smtplib、schedule等核心库,通过真实场景案例,快速掌握自动化脚本编写技巧,解放双手,显著提升工作与生活效率,让代码真正服务于你的日常。
🥇 点击进入Python爬虫实战专栏,解锁网络数据宝库!本专栏手把手教你使用Python核心库(如requests、BeautifulSoup、Scrapy)构建高效爬虫。从基础网页解析到动态页面抓取、数据存储(CSV/数据库)、反爬策略应对及IP代理使用,通过实战项目(如电商比价、新闻聚合、图片采集、舆情监控),掌握合法合规获取并利用网络数据的核心技能,让数据成为你的超能力。
🥇 点击进入Python项目实战专栏,告别碎片化学习,挑战真实项目!本专栏精选Web应用开发(Flask/Django)、数据分析可视化、自动化办公系统、简易爬虫框架、API接口开发等综合项目。通过需求分析、架构设计、编码实现、测试部署的全流程,深入掌握工程化开发、代码复用、调试排错与团队协作核心能力,积累高质量作品集,真正具备解决复杂问题的Python实战经验。
🌐 前篇文章咱们讲解了 Python入门:Python3 lambda匿名函数全面学习教程 ,如果忘记了,可以去重温一下,不停的重复敲击基础代码,有助于让你更加熟练掌握一门语言。今天咱们学习 Python3 装饰器全面学习教程,下面开始吧!
装饰器(decorators)是 Python 中一种极具特色的高级功能,它能让你在不修改原有函数或类代码的情况下,动态地扩展或修改它们的行为。无论是日志记录、性能分析还是权限控制,装饰器都能帮你优雅地实现这些功能。本文将从基础语法到实战案例,全面讲解 Python 装饰器的使用方法。
一、装饰器的核心概念
1. 什么是装饰器?
装饰器本质上是一个函数,它接收一个函数或类作为参数,并返回一个新的函数或修改后的类。通过这种方式,我们可以在不侵入原函数代码的前提下,为其添加额外功能。
2. 装饰器的语法糖
Python 为装饰器提供了简洁的语法:使用 @decorator_name
前缀放在函数或类的定义前,即可完成装饰。例如:
@my_decoratordef target_function(): pass
这等价于手动将函数传入装饰器并重新赋值:
def target_function(): passtarget_function = my_decorator(target_function)
二、函数装饰器:基础与进阶
1. 最简单的装饰器示例
下面是一个打印函数执行前后日志的装饰器:
def my_decorator(func): def wrapper(): print(\"在原函数之前执行\") # 前置操作 func() # 调用原函数 print(\"在原函数之后执行\") # 后置操作 return wrapper@my_decoratordef say_hello(): print(\"Hello!\")say_hello()
输出结果:
在原函数之前执行Hello!在原函数之后执行
解析:
my_decorator
是装饰器函数,接收say_hello
作为参数;wrapper
是包裹函数,实际执行时会替代原函数;- 装饰后调用
say_hello()
,本质是调用wrapper()
。
2. 带参数的函数装饰器
如果原函数需要传入参数,只需在 wrapper
中使用 *args
和 **kwargs
接收:
def my_decorator(func): def wrapper(*args, **kwargs): print(\"在原函数之前执行\") func(*args, **kwargs) # 传递参数给原函数 print(\"在原函数之后执行\") return wrapper@my_decoratordef greet(name): print(f\"Hello, {name}!\")greet(\"Alice\") # 传入参数
输出结果:
在原函数之前执行Hello, Alice!在原函数之后执行
3. 装饰器本身带参数
如果装饰器需要自定义参数(如重复执行次数),需在外层再包裹一个函数:
def repeat(num_times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(num_times): # 使用装饰器参数 func(*args, **kwargs) return wrapper return decorator@repeat(3) # 装饰器传入参数:执行3次def say_hello(): print(\"Hello!\")say_hello()
输出结果:
Hello!Hello!Hello!
解析:
repeat
是“装饰器工厂”,接收参数并返回真正的装饰器decorator
;@repeat(3)
等价于say_hello = repeat(3)(say_hello)
。
三、类装饰器:动态修改类行为
类装饰器接收一个类作为参数,返回一个新的类或修改后的类,常用于扩展类功能或控制实例化过程。
1. 函数形式的类装饰器
给类的方法添加日志功能:
def log_class(cls): class Wrapper: def __init__(self, *args, **kwargs): self.wrapped = cls(*args, **kwargs) # 实例化原始类 def __getattr__(self, name): # 转发未定义的属性访问到原始类实例 return getattr(self.wrapped, name) def display(self): # 增强 display 方法:添加日志 print(f\"调用 {cls.__name__}.display() 前\") self.wrapped.display() print(f\"调用 {cls.__name__}.display() 后\") return Wrapper@log_classclass MyClass: def display(self): print(\"这是 MyClass 的 display 方法\")obj = MyClass()obj.display()
输出结果:
调用 MyClass.display() 前这是 MyClass 的 display 方法调用 MyClass.display() 后
2. 类形式的类装饰器(单例模式实现)
通过类装饰器控制类只能创建一个实例(单例模式):
class SingletonDecorator: def __init__(self, cls): self.cls = cls # 保存原始类 self.instance = None # 存储唯一实例 def __call__(self, *args, **kwargs): # 拦截实例化,确保只创建一个实例 if self.instance is None: self.instance = self.cls(*args, **kwargs) return self.instance@SingletonDecoratorclass Database: def __init__(self): print(\"Database 初始化\")db1 = Database() # 首次实例化:执行初始化db2 = Database() # 再次实例化:返回已创建的实例print(db1 is db2) # True(证明是同一个实例)
输出结果:
Database 初始化True
四、Python 内置装饰器
Python 提供了几个常用的内置装饰器,简化类方法的定义:
1.** @staticmethod :定义静态方法(无需实例化即可调用,无 self
参数)。
2. @classmethod :定义类方法(第一个参数为类本身 cls
,可通过类直接调用)。
3. @property **:将方法转为属性,可像访问属性一样调用(常用于封装 getter/setter)。
示例代码:
class MyClass: @staticmethod def static_method(): print(\"这是静态方法(无需实例化)\") @classmethod def class_method(cls): print(f\"这是 {cls.__name__} 的类方法\") @property def name(self): return self._name # getter @name.setter def name(self, value): self._name = value # setter# 使用静态方法和类方法(无需实例化)MyClass.static_method()MyClass.class_method()# 使用 @property 定义的属性obj = MyClass()obj.name = \"Alice\" # 调用 setterprint(obj.name) # 调用 getter(输出:Alice)
五、多个装饰器的堆叠使用
装饰器支持堆叠,即一个函数可被多个装饰器修饰,执行顺序为从下到上。
示例代码:
def decorator1(func): def wrapper(): print(\"Decorator 1 执行\") func() return wrapperdef decorator2(func): def wrapper(): print(\"Decorator 2 执行\") func() return wrapper@decorator1 # 上层装饰器:最后执行@decorator2 # 下层装饰器:先执行def say_hello(): print(\"Hello!\")say_hello()
输出结果:
Decorator 1 执行Decorator 2 执行Hello!
解析:堆叠等价于 say_hello = decorator1(decorator2(say_hello))
,因此 decorator2
先于 decorator1
执行。
六、装饰器的应用场景总结
装饰器在实际开发中应用广泛,常见场景包括:
-** 日志记录 :自动记录函数调用参数、返回值和执行时间。
- 性能分析 :统计函数执行耗时,定位性能瓶颈。
- 权限控制 :在函数执行前验证用户权限,无权限则拦截。
- 缓存机制 :缓存函数计算结果,重复调用时直接返回缓存值(如 functools.lru_cache
)。
- 输入验证 **:检查函数参数是否符合要求,提前报错。
总结
装饰器是 Python 中极具灵活性的特性,通过“包装”机制实现了代码的复用与扩展。掌握装饰器不仅能让代码更简洁优雅,还能应对复杂的功能扩展需求。建议从简单案例开始练习,逐步理解其“嵌套函数”和“动态替换”的核心逻辑,最终灵活运用于实际项目中。
💡下一篇咱们学习 Python3 数据结构全面学习教程!
附录:扩展学习资源
- 官方资源:
- Python官网:https://www.python.org
- PyPI:https://pypi.org(查找第三方库)
- 安装包等相关文件(另附带pycharm工具),网盘下载地址:https://pan.quark.cn/s/649af731037c
- 学习资料视频和文档资源,网盘下载地址: https://pan.quark.cn/s/ee16901a8954
- 本专栏特色资源:
- 代码资源仓库:CSDN专属资源在线获取
- 海量Python教程:关注公众号:xcLeigh,获取网盘地址
- 一对一答疑:添加微信与博主在线沟通(
备注“Python专栏”
)
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🏰 大屏可视化 🌀 带你体验酷炫大屏!
💯 神秘个人简介 🌀 带你体验不一样得介绍!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!
💦 注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。
📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌