34 | 编程范式:修饰器模式
陈皓
该思维导图由 AI 生成,仅供参考
你好,我是陈皓,网名左耳朵耗子。
在上一讲中,我们领略了函数式编程的趣味和魅力,主要讲了函数式编程的主要技术。还记得有哪些吗?递归、Map、Reduce、Filter 等,并利用 Python 的 Decorator 和 Generator 功能,将多个函数组合成了管道。
此时,你心中可能会有个疑问,这个 decorator 又是怎样工作的呢?这就是本文中要讲述的内容,“Decorator 模式”,又叫“修饰器模式”,或是“装饰器模式”。
Python 的 Decorator
Python 的 Decorator 在使用上和 Java 的 Annotation(以及 C# 的 Attribute)很相似,就是在方法名前面加一个 @XXX 注解来为这个方法装饰一些东西。但是,Java/C# 的 Annotation 也很让人望而却步,太过于复杂了。你要玩它,需要先了解一堆 Annotation 的类库文档,感觉几乎就是在学另外一门语言。
而 Python 使用了一种相对于 Decorator Pattern 和 Annotation 来说非常优雅的方法,这种方法不需要你去掌握什么复杂的 OO 模型或是 Annotation 的各种类库规定,完全就是语言层面的玩法:一种函数式编程的技巧。
这是我最喜欢的一个模式了,也是一个挺好玩儿的东西,这个模式动用了函数式编程的一个技术——用一个函数来构造另一个函数。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
修饰器模式在Python和Go语言中的应用是本文的重点。文章通过丰富的代码示例和详细的解释,生动地介绍了修饰器模式的工作原理和应用技巧。在Python中,修饰器模式通过装饰函数和类的方式实现,作者展示了修饰器的基本语法、回调机制、带参数的修饰器以及类方式声明修饰器的执行顺序。此外,还介绍了通过URL路由调用注册函数的实际示例。在Go语言中,虽然没有修饰器语法糖,但通过高阶函数和匿名函数的组合,也能实现类似的功能。作者展示了在Go语言中使用高阶函数实现修饰器的方法,并通过示例展示了修饰器的嵌套和组合。同时,文章还探讨了Go语言中修饰器模式的局限性,提出了使用反射机制实现通用修饰器的方法。总的来说,本文通过对Python和Go语言中修饰器模式的深入讲解,为读者提供了全面了解修饰器模式的机会,展示了修饰器模式在不同语言中的灵活应用和技术特点。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》,新⼈⾸单¥98
《左耳听风》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(29)
- 最新
- 精选
- 楊_宵夜越看越觉得装饰器模式是属于AOP思想的一种实现🤔。2018-02-02542
- 陈华...感觉还是转行算了....,2019-06-20125
- minghu6其实Java装饰器和Python装饰器还是差别挺大的,Python装饰器是一个高阶函数,Java的则真的是"注解",只是起到一个打标签的作用,还要另外的类来检查特定标签进行特定处理。2018-02-14116
- 麻花快跑耗子叔,我看你博客和文章很久了,从coolshell就开始了,现在也快30了,但是越来越焦虑,他们都说是30岁程序员的普遍情况,希望耗子叔能以过来人的身份写下这方面的文章,为我们指点下迷路2018-01-25211
- seedjyh理解python的函数型装饰器,关键就是分清3个函数。 - 被装饰的函数 raw_fn - 装饰后的函数 new_fn - 执行装饰的函数 decoractor_fn 其中,raw_fn 和 new_fn 的函数签名(参数和返回值)是相同的,就是一连串@之后真正手写def的那个函数。 decoractor_fn 的参数是 raw_fn,在内部定义new_fn并返回之。 至于带参数的装饰器,其实就是产生装饰器的工厂,本身并不是装饰器。 decoractor_factory的参数可以随便写,其内部定义一个decoractor_fn并返回。 类模式的装饰器有点像C++的仿函数。 Golang的装饰器,在框架echo的middleware这里体现得淋漓尽致。2021-10-198
- 少盐基本没看懂,后面的总结基本知道装饰器是干嘛的2018-12-157
- 浩子耗子哥,文章写的很有意思。最近也在相继学习Go语言。 不过我很纠结,我是一名.net的技术主管,最近想开拓其他语言的方向。可是却不知道从何下手,比较感兴趣的有Go,Java,Python。可是时间总是有限的。 不知道从哪面方面进行深入研究。2018-01-2527
- edisonhuang通过装饰器,我们很容易的给代码添加一些功能,附加执行一些操作。然后深入之后发现装饰器可以修饰任何函数,加不同函数随意组合和拼装往往会带来一些神奇的效果,恰如linux的编码哲学,一个工具只做一件事并把这件事做到极致。 通过装饰器的封装,我们可以把很多业务逻辑,重复代码给消除,从而优化代码2019-06-213
- 拉欧这一章的内容真带劲2019-05-273
- 恒go语言的第一个例子让我联想到java的静态代理,后面反射的例子让我联想到java的动态代理2018-09-193
收起评论