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
0
投稿
猜你喜欢
- 生产图片区域,上传按钮#btn可替换自己想要的图片<ul id="ul_pics" class="ul_
- 查询操作和性能优化1.基本操作增models.Tb1.objects.create(c1='xx', c2='oo&
- 一、平稳序列建模步骤假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列,就可以利用ARMA模型对该序列进行建模。建模的基本步骤如下:
- 前言把以前一直只限于知道,却不清晰理解的这几个概念完完整整地梳理了一番。内容参考自wiki页面,然后加上自己一些理解。词法作用域和动态作用域
- python是一门灵活的语言,也可以说python是一门胶水语言,顾名思义,就是其可以导入各类的包,python的包可以说是所有语言中最多的
- 在项目开发中,经常出现这样的需求。在新增或修改一个主表数据时,对应的从表也要进行同步,此时我们是怎么操作的了?典型的方法就是对于主表的各数据
- 一对多(ForeignKey)class ForeignKey(ForeignObject): def __init__(sel
- 前言:开发环境:python 3.8pycharm 2021.2 专业版代码实现:发送请求获取数据解析数据(筛选数据)保存数据连接数据库请求
- 大概在2004年初的时候,我第一次买了一本很厚的书,名字或许叫《Dreamweaver MX从入门到精通》,很认真看着书并实践操作大约三分之
- 这篇文章主要介绍了python列表推导式入门学习解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 本文实例讲述了vue动态组件和v-once指令。分享给大家供大家参考,具体如下:点击按钮时,自动切换两个组件<component :i
- 前言之前学习过binarytree第三方库,了解了它定义的各种基本用法。昨天在问答频道中做题时碰到一个关于二叉树的算法填空题,感觉代码不错非
- 一. Python中表示时间的两种方式:时间戳:相对于1970.1.1 00:00:00以秒计算的偏移量,唯一的时间元组struct_tim
- 使用xlrd模块和xlwt模块解题思想:xlwt模块是非追加写.xls的模块,所以要借助for循环和列表,来一次性写入,这样就没有追加与非追
- 5位数日期戳读取 .mat 文件处理里面数据时,发现里面的日期数据全部都是 “5位数” 数字,很不解;后来查到可以在excel中通过设置单元
- 1.彻底弄懂CSS盒子模式一(DIV布局快速入门) 2.彻底弄懂CSS盒子模式二(导航栏实例) 4.彻底弄懂CSS盒子模式四(绝对定位和相对
- 前言最近在研究怎么对图片资源进行无损压缩,网上也找了一些资料。总而言之,收获不少,所以想对最近的学习做个总结。无损压缩其实是相对而言的,目的
- 实际项目中遇到python模块相互引用问题,查资料,终于算是弄明白了。首先交叉引用或是相互引用,实际上就是导入循环,关于导入循环的详细说明,
- 如下所示:# coding: utf-8import paramikoimport MySQLdbdef main(): connectio
- 下载资源hadoop3.0.0spark-2.4.4-bin-without-hadoopwinutils下载(对应hadoop3.0.1的