python设计模式之装饰器模式
作者:??图图加油???? 时间:2023-04-28 07:55:40
装饰器模式
装饰器模式解决什么问题?
增加新功能,且不改变原有功能和代码
选配,根据不同情况,动态调整功能
装饰器,顾名思义,就是用来装饰其他实物,增加被装饰物的功能而不改变被装饰物。这就像我们买车,同一款车型,有很多功能是选配的,但是车的核心功能不变。我们可以在购买时,根据需要选配不同的配置。
如何实现?
想象一下,你是一个装修工,如果要装饰一辆车,那么你首先需要有一辆车,而且在装饰过程中,你不能够改变车原有的功能(接口)。
如类图所示:
核心功能Core和所有装饰器都必须实现Interface接口
所有装饰器以组合的方式保存接口实例
class Core:
def some_action():
pass
class Decorator:
def __init__(self,core):
self.core = core
def some_action():
....
self.core.some_action()
.....
python 装饰器语法糖
装饰器太常用了,python专门的语法糖简化了装饰器的使用。最外层函数接收一个函数对象并返回内层函数,内层函数是正真的执行函数。
# 装饰器定义
def decorator(func):
def wrapper(*args,**kwargs):
.....
result = func(*args,**kwargs)
....
return result
return wrapper
# 装饰器使用
@decorator
def func():
pass
虽然形式变了,但是实质没有变:保存接口实例,实现相同的接口。
保存接口实例容易理解,因为传入了函数func对象。
实现相同的接口怎么理解?语法糖@xxxx的操作等价于
func = decorator(func)
,即将内层函数重命名了原函数名。
来源:https://juejin.cn/post/7095776102341148708
标签:python,设计,装饰器,模式
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Unicode和Python的中文处理
2022-08-17 21:05:27
解决python打不开文件(文件不存在)的问题
2021-10-15 02:39:46
HTML语言将加入硬件操作功能
2009-12-16 19:19:00
![](https://img.aspxhome.com/file/UploadPic/200912/16/01-55s.jpg)
vue缓存的keepalive页面刷新数据的方法
2023-07-02 17:01:00
MySQL中union和order by同时使用的实现方法
2024-01-26 22:48:45
![](https://img.aspxhome.com/file/2023/9/124549_0s.png)
python中进程间通信及设置状态量控制另一个进程
2022-01-28 08:02:57
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2024-04-19 10:25:21
Python实现AI自动玩俄罗斯方块游戏
2021-11-16 23:11:41
![](https://img.aspxhome.com/file/2023/2/103682_0s.jpg)
浅谈python requests 的put, post 请求参数的问题
2023-05-06 14:54:47
![](https://img.aspxhome.com/file/2023/1/101651_0s.jpg)
Flask SQLAlchemy一对一,一对多的使用方法实践
2021-08-22 22:52:30
Python之列表的插入&替换修改方法
2023-04-15 00:38:27
Python读取excel指定列生成指定sql脚本的方法
2021-05-06 19:11:13
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2022-10-07 21:49:15
![](https://img.aspxhome.com/file/2023/8/130538_0s.gif)
详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始
2024-01-13 05:43:07
python实现scrapy爬虫每天定时抓取数据的示例代码
2022-05-04 22:33:18
![](https://img.aspxhome.com/file/2023/9/105379_0s.png)
Python @property原理解析和用法实例
2023-05-19 00:59:41
MySQL无法输入中文字符问题的解决办法
2024-01-22 08:26:56
![](https://img.aspxhome.com/file/2023/3/89923_0s.jpg)
Django 删除upload_to文件的步骤
2022-03-23 05:47:14
![](https://img.aspxhome.com/file/2023/7/107627_0s.jpg)
JS 函数的 call、apply 及 bind 超详细方法
2024-04-30 10:42:28
Tensorflow 自定义loss的情况下初始化部分变量方式
2023-02-26 22:43:39