详解Python中最难理解的点-装饰器
发布时间 - 2026-01-11 00:29:48 点击率:次本文将带领大家由浅入深的去窥探一下,这个装饰器到底是何方神圣,看完本篇,装饰器就再也不是难点了.

一、什么是装饰器
网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象
- 每个人都有的内裤主要是用来遮羞,但是到了冬天它没法为我们防风御寒,肿木办?
- 我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤
- 在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后再也不冷了
装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效
二、装饰器的前传4步曲
为什么讲装饰器要放在入门篇的末尾讲呢,因为这货太难了,里面有许多前提要懂。Python的函数相信大家都懂了,但是大家知不知道函数也是一种对象,可以像参数一样传递,我们看下面的例子吧:
1)函数也是对象
def message(word='hello'): return word.upper()+'!' print message() >> HELLO! my_message=message print my_message >> <function message at 0x000000000288E198> print my_message() >> HELLO!
也就是说message可以赋值给另外一个变量
2)函数可以嵌套,定义在另外一个函数内部
def show(): print 'Run in show()' def message(word='hello'): return word print message() show() >> Run in show() hello
message可以嵌套在show函数里面,调用show的时候也会跑下message函数
3)函数作为参数返回
一个函数还可以当做另外一个函数的返回值,不信看下面这个例子
>> <function lower at 0x00000000027DAD68> hello...
4)函数作为参数传入
我们先创建一个getName函数,然后把这个函数当做参数传递给foo函数
>> I will call the getName function later leo
三、装饰器的真面目
1).经过前面几步,大家应该理解了函数可以作为参数传入,也可以当参数返回,而且还可以嵌套
装饰器其实就是对函数进行再次包装,它能够在不改变函数的前提下,增加函数的功能,可以在函数执行之前或者执行之后执行一段代码
a_stand_alone_function() >> I am a stand alone function,don't you dare modify me a_stand_alone_function_decorated=my_new_decorator(a_stand_alone_function) a_stand_alone_function_decorated() >> Before the function runs I am a stand alone function,don't you dare modify me After the function runs
2).使用装饰器
看这样简单吧,装饰器有一个语法糖@,直接@my_new_decorator就把上面一坨代码轻松化解了,这就是Pythonic的代码,简洁高效
其实相当于:
another_stand_alone_function=my_new_decorator(another_stand_alone_function)
四、为什么要使用装饰器
装饰器提供了一些和代码维护性和审美相关的优点。并且作为结构化工具,装饰器自然地促进了代码的封装,这减少了冗余性并使得未来维护和扩展变得更容易。
如果大家学过Django和Flask就会知道,web框架里面大量的使用装饰器进行代码的封装.我们下面看一个简单的例子:
我们有一个主题函数word()是输出一个字符串,我们有一个函数是把字符串变粗体,另外一个是变斜体。有了装饰器之后,我们可以非常灵活的组合,扩展函数的功能:
>> <b><i>hello</i></b>
有一点要注意,就是装饰器的顺序变了,结果是不一样的.
@makeitalic @makebold def word(): return "hello" print word() >> <i><b>hello</b></i>
好了装饰器的入门,就讲到这里,若有什么不懂的,也可以留言跟我探讨交流。其实还有很多装饰器的高级用法,比如装饰器传参数,类的装饰器等等我们后面会讲解。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# python装饰器详解
# python
# 装饰器
# 参数
# python装饰器的作用
# Python 装饰器使用详解
# 深入浅出分析Python装饰器用法
# 老生常谈Python之装饰器、迭代器和生成器
# Python中装饰器兼容加括号和不加括号的写法详解
# Python的装饰器使用详解
# 带你了解python装饰器
# 深入理解Python中装饰器的用法
# 详解 Python中LEGB和闭包及装饰器
# 还可以
# 有一个
# 一个函数
# 前提下
# 另外一个
# 就会
# 都有
# 成了
# 好了
# 放在
# 也会
# 就像
# 有个
# 我觉得
# 大家都
# 这就是
# 还能
# 每个人
# 由浅入深
# 不懂
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速生成高效建站系统源代码?
南京网站制作费用,南京远驱官方网站?
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
太平洋网站制作公司,网络用语太平洋是什么意思?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
高端企业智能建站程序:SEO优化与响应式模板定制开发
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
如何用狗爹虚拟主机快速搭建网站?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
nodejs redis 发布订阅机制封装实现方法及实例代码
海南网站制作公司有哪些,海口网是哪家的?
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
如何用免费手机建站系统零基础打造专业网站?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
Laravel如何为API生成Swagger或OpenAPI文档
大连网站制作公司哪家好一点,大连买房网站哪个好?
做企业网站制作流程,企业网站制作基本流程有哪些?
北京企业网站设计制作公司,北京铁路集团官方网站?
中山网站推广排名,中山信息港登录入口?
如何在IIS7中新建站点?详细步骤解析
常州企业网站制作公司,全国继续教育网怎么登录?
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
js实现点击每个li节点,都弹出其文本值及修改
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
北京网站制作的公司有哪些,北京白云观官方网站?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
Angular 表单中正确绑定输入值以确保提交与验证正常工作
如何在云服务器上快速搭建个人网站?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
如何在IIS7上新建站点并设置安全权限?
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
Laravel如何实现数据库事务?(DB Facade示例)
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
香港服务器租用每月最低只需15元?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
高防服务器租用首荐平台,企业级优惠套餐快速部署
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
利用JavaScript实现拖拽改变元素大小
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
简历没回改:利用AI润色让你的文字更专业
香港服务器建站指南:免备案优势与SEO优化技巧全解析
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
Android中AutoCompleteTextView自动提示

