最新回答

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中的装饰器常用于哪些应用场景相关推荐

  1. python装饰器 property_Python中@property装饰器的使用技巧性解析(代码示例)

    Python中@property装饰器的技巧性用法(代码示例) 本篇文章给大家带来的内容是关于Python中@property装饰器的技巧性用法(代码示例),有一定的参考价值,有需要的朋友可以参考一下 ...

  2. dio拦截器 flutter_Flutter 中 Dio 拦截器

    有时我们不需要复杂的应用程序,只需要显示一个数据列表的简单功能,我们可以通过一个简单的方法来实现: Future fetchItems() { return Dio().("https:// ...

  3. axios拦截器 config_vue中axios拦截器的使用

    1.拦截器分为request请求拦截器和response响应拦截器 PS:request请求拦截器:发送请求前统一处理,如:设置请求头headers.应用的版本号.终端类型等. response响应拦 ...

  4. 呕心整理Java中的12种常用设计模式以及应用场景

    目录 单例模式 饿汉模式 懒汉模式 线程锁模式 双重判断模式 静态内部类模式 策略模式 工厂模式 简单工厂 抽象工厂 门面模式 装饰器模式 责任链模式 享元模式 观察者模式 代理模式 静态代理模式 动 ...

  5. python重写和装饰器_python中的装饰器

    装饰器的本质: 当你在用某个@decorator来修饰某个函数func时,如下所示: @decorator def func(): pass 其解释器会解释成下面这样的语句: func=decorat ...

  6. python中修饰器_python 中的修饰器

    参考文章 @property和@ .setter的用法: @property 把属性装饰成get方法 给属性赋值时,会自动调用@property装饰的方法 只设置属性的@property 时,属性为只 ...

  7. maya阿诺德渲染失败_maya2018无法加载ARNOLD渲染器?maya2018中ARNOLD渲染器加载不了怎么办?...

    maya2018无法加载ARNOLD渲染器可通过以下方法解决. 1.首先右键点击我的电脑并选择属性. 2.然后点击高级系统设置,打开系统属性面板. 3.打开系统属性面板之后在高级选项卡下点击环境变量. ...

  8. java中什么是布局管理器_Java中布局管理器

    布局管理器种类 FlowLayout: 组件在一行中从左至右水平排列,排满后折行,它是Panel.Applet的默认布局管理器. BorderLayout:北.南.东.西.中,它是Window.Fra ...

  9. java访问器_Java中的访问器方法

    因此,我对" setter"和" getter"方法以及它们的有用与否有疑问. 假设我只是写了一个非常基本的程序,如下所示: public class Acco ...

  10. SpringMVC中的拦截器

    SpringMVC中的拦截器 拦截器的作用 Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现 ...

最新文章

  1. SpringMVC处理MYSQL BLOB字段的上传
  2. spring boot 异常设计原理
  3. linux top 命令可视化_Linux top命令使用详解:显示或管理执行中的程序
  4. c语言大作业_2018 C语言大作业--21_Ekko制作教程
  5. oracle的undo
  6. 无法在Web服务器上启动调试。与Web服务器通信时出现身份验证错误
  7. 解读知识蒸馏模型TinyBert
  8. pythonnumpy详解_Python精讲Numpy基础,大牛笔记详细解释
  9. 使用slf4j和log4j记录日志
  10. matplotlib-legend 位置属性 loc 使用
  11. IDEA快速升级模块版本号
  12. 海洋迅雷VIP帐号获取器
  13. 陀螺仪传感器的简单了解
  14. 【TJOI2019】唱、跳、rap和篮球(DP)(容斥)
  15. Java文档注释【自制API】
  16. VAF,MAF,肿瘤纯度,MCF,CCF的概念和计算方法 (转载)
  17. 如何用Python写一个安卓APP
  18. 超高性价比——DIY 斯坦福Pupper机器狗
  19. Linux服务器查看带宽,进程和线程
  20. python在线办公自动化oa系统django408

热门文章

  1. spring配置文件中分别使用多个properties文件
  2. BZOJ-3065 带插入区间K小值
  3. 数据表迁移数据一致性验证
  4. 【转载】如何去除C#Strings中的空格?
  5. 原来博客园的日历是这样用的!
  6. Interesting Array
  7. 在Gulp中使用BrowserSync
  8. 使用Struts2防止表单重复提交
  9. 【Win32API】SendInput ERROR_BUSY 错误原因
  10. Autorun.inf文件(2):改变硬盘分区图标