python设计模式之装饰器模式

作者:??图图加油???? 时间:2023-04-28 07:55:40 

装饰器模式

装饰器模式解决什么问题?

  • 增加新功能,且不改变原有功能和代码

  • 选配,根据不同情况,动态调整功能

装饰器,顾名思义,就是用来装饰其他实物,增加被装饰物的功能而不改变被装饰物。这就像我们买车,同一款车型,有很多功能是选配的,但是车的核心功能不变。我们可以在购买时,根据需要选配不同的配置。

如何实现?

想象一下,你是一个装修工,如果要装饰一辆车,那么你首先需要有一辆车,而且在装饰过程中,你不能够改变车原有的功能(接口)。

python设计模式之装饰器模式

如类图所示:

  • 核心功能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,设计,装饰器,模式
0
投稿

猜你喜欢

  • Unicode和Python的中文处理

    2022-08-17 21:05:27
  • 解决python打不开文件(文件不存在)的问题

    2021-10-15 02:39:46
  • HTML语言将加入硬件操作功能

    2009-12-16 19:19:00
  • vue缓存的keepalive页面刷新数据的方法

    2023-07-02 17:01:00
  • MySQL中union和order by同时使用的实现方法

    2024-01-26 22:48:45
  • python中进程间通信及设置状态量控制另一个进程

    2022-01-28 08:02:57
  • JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参

    2024-04-19 10:25:21
  • Python实现AI自动玩俄罗斯方块游戏

    2021-11-16 23:11:41
  • 浅谈python requests 的put, post 请求参数的问题

    2023-05-06 14:54:47
  • 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
  • 详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始

    2024-01-13 05:43:07
  • python实现scrapy爬虫每天定时抓取数据的示例代码

    2022-05-04 22:33:18
  • Python @property原理解析和用法实例

    2023-05-19 00:59:41
  • MySQL无法输入中文字符问题的解决办法

    2024-01-22 08:26:56
  • Django 删除upload_to文件的步骤

    2022-03-23 05:47:14
  • JS 函数的 call、apply 及 bind 超详细方法

    2024-04-30 10:42:28
  • Tensorflow 自定义loss的情况下初始化部分变量方式

    2023-02-26 22:43:39
  • asp之家 网络编程 m.aspxhome.com