python装饰器-python中的装饰器常用于哪些应用场景
最新回答
2019-12-08回答
所谓装饰器就是把函数包装一下,为函数添加一些附加功能,装饰器就是一个函数,参数为被包装的函数,返回包装后的函数:你可以试下: de d(p): de _d(*arg, **karg): print "do sth beore p.." r= p(*arg, **karg) print "do sth ater p...
装饰者模式(Decorator Pattern),是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
使用装饰者模式的时候需要注意一下几点内容:
(1)装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
(2)装饰对象包含一个真实对象的引用。
(3)装饰对象接受所有的来自客户端的请求,它把这些请求转发给真实的对象。
(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。然而,装饰者模式,不需要子类可以在应用程序运行时,动态扩展功能,更加方便、灵活。
适用装饰者模式场
通常可以理解它是一个hook 的回调函数。
或者是理解成python 留给二次开发的一个内置API。 一般是用回调和hook 方式实现的。
简单来讲,可以不严谨地把Python的装饰器看做一个包装函数的函数。
比如,有一个函数:
def func():
print 'func() run.'
if '__main__' == __name__:
func()
运行后将输出:
func() run.
现在需要在函数运行前后打印一条日志, 但是又不希望或者没有权限修改函数内部的结构, 就可以用到装饰器(decorator):
def log(function):
def wrapper(*args, **kwargs):
print 'before function [%s()] run.' % function.__name__
rst = function(*args, **kwargs)
print 'after function [%s()] run.' % function.__name__
return rst
return wrapper
@log
def func():
print 'func() run.'
if '__main__' == __name__:
func()
对于原来的函数"func()"并没有做修改,而是给其使用了装饰器log,运行后的输出为:
before function [func()] run.
func() run.
after function [func()] run.
把"@log"放到func()函数
所谓装饰器就是把函数包装一下,为函数添加一些附加功能,装饰器就是一个函数,参数为被包装的函数,返回包装后的函数:你可以试下:12345678910111213def d(fp): def _d(*arg, **karg): print "do sth before fp.." r= fp(*arg, **karg) print "do sth after fp.." return r return _d @ddef f(): print "call f"#上面使用@d来表示装饰器和下面是一个意思#f = d(f)
首先十分不推荐这种做法, 会令程序难以维护.
其次, 多个装饰器是按照装饰器的顺序进行执行的.
如果你编写过装饰器, 你就应该知道, 其实装饰器就是把函数的名字传入进去, 在执行函数之前, 进行一些提前的处理.
例如下面这段代码, 自定义的装饰器
def add_schedid(handler_func):
"""
@handler_func: 请求处理函数
"""
@functools.wraps(handler_func)
def wrapper(self, *args, **kwargs):
"""
wrapper
"""
# handler_func就是所装饰的函数,可以在这里做一些真正函数执行前所需的处理,
handler_func(self, *args, **kwargs)
return wrapper
装饰器本身就是一个函数, 将所装饰的函数, 作为一个参数传进来, 然后在执行这个函数之前, 进行一个处理,这就是装饰器. 所以和正常函数执行顺序是一样的..
python装饰器-python中的装饰器常用于哪些应用场景相关推荐
- python装饰器 property_Python中@property装饰器的使用技巧性解析(代码示例)
Python中@property装饰器的技巧性用法(代码示例) 本篇文章给大家带来的内容是关于Python中@property装饰器的技巧性用法(代码示例),有一定的参考价值,有需要的朋友可以参考一下 ...
- dio拦截器 flutter_Flutter 中 Dio 拦截器
有时我们不需要复杂的应用程序,只需要显示一个数据列表的简单功能,我们可以通过一个简单的方法来实现: Future fetchItems() { return Dio().("https:// ...
- axios拦截器 config_vue中axios拦截器的使用
1.拦截器分为request请求拦截器和response响应拦截器 PS:request请求拦截器:发送请求前统一处理,如:设置请求头headers.应用的版本号.终端类型等. response响应拦 ...
- 呕心整理Java中的12种常用设计模式以及应用场景
目录 单例模式 饿汉模式 懒汉模式 线程锁模式 双重判断模式 静态内部类模式 策略模式 工厂模式 简单工厂 抽象工厂 门面模式 装饰器模式 责任链模式 享元模式 观察者模式 代理模式 静态代理模式 动 ...
- python重写和装饰器_python中的装饰器
装饰器的本质: 当你在用某个@decorator来修饰某个函数func时,如下所示: @decorator def func(): pass 其解释器会解释成下面这样的语句: func=decorat ...
- python中修饰器_python 中的修饰器
参考文章 @property和@ .setter的用法: @property 把属性装饰成get方法 给属性赋值时,会自动调用@property装饰的方法 只设置属性的@property 时,属性为只 ...
- maya阿诺德渲染失败_maya2018无法加载ARNOLD渲染器?maya2018中ARNOLD渲染器加载不了怎么办?...
maya2018无法加载ARNOLD渲染器可通过以下方法解决. 1.首先右键点击我的电脑并选择属性. 2.然后点击高级系统设置,打开系统属性面板. 3.打开系统属性面板之后在高级选项卡下点击环境变量. ...
- java中什么是布局管理器_Java中布局管理器
布局管理器种类 FlowLayout: 组件在一行中从左至右水平排列,排满后折行,它是Panel.Applet的默认布局管理器. BorderLayout:北.南.东.西.中,它是Window.Fra ...
- java访问器_Java中的访问器方法
因此,我对" setter"和" getter"方法以及它们的有用与否有疑问. 假设我只是写了一个非常基本的程序,如下所示: public class Acco ...
- SpringMVC中的拦截器
SpringMVC中的拦截器 拦截器的作用 Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现 ...
最新文章
- SpringMVC处理MYSQL BLOB字段的上传
- spring boot 异常设计原理
- linux top 命令可视化_Linux top命令使用详解:显示或管理执行中的程序
- c语言大作业_2018 C语言大作业--21_Ekko制作教程
- oracle的undo
- 无法在Web服务器上启动调试。与Web服务器通信时出现身份验证错误
- 解读知识蒸馏模型TinyBert
- pythonnumpy详解_Python精讲Numpy基础,大牛笔记详细解释
- 使用slf4j和log4j记录日志
- matplotlib-legend 位置属性 loc 使用
- IDEA快速升级模块版本号
- 海洋迅雷VIP帐号获取器
- 陀螺仪传感器的简单了解
- 【TJOI2019】唱、跳、rap和篮球(DP)(容斥)
- Java文档注释【自制API】
- VAF,MAF,肿瘤纯度,MCF,CCF的概念和计算方法 (转载)
- 如何用Python写一个安卓APP
- 超高性价比——DIY 斯坦福Pupper机器狗
- Linux服务器查看带宽,进程和线程
- python在线办公自动化oa系统django408