python版:装饰器模式
装饰器模式介绍
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰器模式实现
设计模式只是一种思想与语言无关,设计模式可以通过多种语言方式去实现它。
今天我们来使用python中函数的闭包形式来类似实现装饰器模式。
下面我们在不改变原函数定的情况下,给原函数添加新的功能。我们在不改动原函数的情况下,给原函数添加日志功能。
装饰器模式python代码展示
import timedef log(func_arg):"""日志装饰器 给调用的函数进行日志打印"""def func_time():print("log %s begin time:%s" % (func_arg.__name__,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time() ) ) ) )func_arg()print("log %s end time:%s" % (func_arg.__name__ ,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))))return func_time@log
def func1():print("func1业务逻辑开始")# func1 函数的业务逻辑for i in range(100000000):passprint("func1业务逻辑结束")
@log
def func2():print("func2业务逻辑开始")# func2 函数的业务逻辑for i in range(100000000):passprint("func2业务逻辑结束")# func1 = log(func1)# 使用python中语法糖进行代替 效果一样
# func2 = log(func2)# 使用python中语法糖进行代替 效果一样
func1()
func2()
装饰器模式python代码说明
采用函数式编程的思想,将需要拓展功能的原函数,将其作为参数 传送到我们的装饰器中,返回一个新的函数替换原函数 ,新函数执行会执行原函数,这样我们就可在执行原函数的前后添加我们自定义的功能了,而不需要改动原函数了。这种利用闭包的实现方式都可以在支持函数式编程的语言中去实现比如JavaScript就可以用差不多的语法进行实现,c语言中可以用指针实现类似的装饰器模式。
还有就是 采用了语法糖可以代替装饰器函数将原函数包起来。
装饰器模式运行结果
python版:装饰器模式相关推荐
- Python设计模式-装饰器模式
Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...
- python之装饰器模式
以下参考知乎,这里是原网址https://www.zhihu.com/question/26930016,我只是参考纪念下 作者:zhijun liu 链接:https://www.zhihu.com ...
- Python Django 装饰器模式之三阶装饰器
- Python Django 装饰器模式之二阶装饰器
- 装饰器模式代码举例(java语言版)
前言:为了解决子类膨胀问题,把被装饰的以关联的方式放入装饰类里面,装饰类添加新的功能,如果需要再扩展新功能的时候,那么可以考虑直接继承装饰类.下面是一个画圆的例子(其实ServletRequest.H ...
- python 装饰器 继承_Python设计模式之装饰器模式
装饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 注意,本文中的Decorat ...
- python装饰器模式带参数_python 装饰器模式 我的理解
python和javascript类似, 可以把函数当作函数的返回值, 比如 def func(f): def subfunc(): print 'subfunc' return subfunc此外f ...
- python中的装饰器、装饰器模式_浅析Python装饰器以及装饰器模式
漫谈 如果作为一个Python入门,不了解Python装饰器也没什么,但是如果作为一个中级Python开发人员,如果再不对python装饰器熟稔于心的话,那么可能并没有量变积累到质变. 我以前也看过很 ...
- 【python设计模式】6、装饰器模式
哲学思想 装饰器模式是一种结构型设计模式,其哲学思想是通过组合和装饰对象来扩展其功能,而不需要修改其底层代码或继承新的类.它遵循了"开放封闭原则",即对扩展开放,对修改关闭. 该模 ...
最新文章
- JavaScript 公有 私有 静态属性和方法
- PMcaff活动 | 汪培公:农村电商模式的重新思考
- 2017.6.11 校内模拟赛
- Java的算法讲解以及案例!
- Spring AOP 实现业务和异常日志记录实战
- python数据类型汇总_python基础数据类型汇总
- JAVA面试常考系列二
- CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)...
- Hibernate Query 的 list 和iterate方法缓存的区别
- 千兆网线制作(包括交叉线)
- 强化学习是人工智能的未来?
- C语言Socket编程(计算机网络作业)
- Linux下和编译器、程序的运行、环境变量等相关的常见问题
- Representation Learning 表示学习(简单笔记)
- 【科创人】维格表创始人陈霈霖:喜茶数字化转型的结晶是vika维格表
- Daily Scrum Meeting 11.13
- 关闭腾讯网迷你版(登录qq后的广告弹窗)
- 配色表和配色网站:获取好看的配色
- Android 蓝牙 ble 随机地址深层次分析
- 支付宝怎么预约新冠疫苗? 疫苗网上预约查询的方法
热门文章
- 如何在PD17虚拟机上安装CentOS Linux系统
- 理性派:数学写真集系列书籍等
- 三维坐标系带偏航角俯仰角_浅谈三维旋转的三种方法及差异
- s7.net 写数据到plc_机器视觉软件开发系列——松下PLC下位机通信协议简介和实现...
- Web笔记-html中svg的基本使用
- C++|Java混合实验-java搭建get方法靶场,Qt发送请求获取数据
- Linux学习笔记-Linux下的设备文件
- win10安装oracle12c注意事项,win10系统安装oracle 12c出现ins-30131错误的修复办法
- java excel 超链接_Java 编辑、删除Excel中的超链接
- 怎么控制ajax执行先后顺序,[转]多个ajax请求时控制执行顺序或全部执行后的操作...