最新回答

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中的类及self详解_python中的self详解与对照与网站分享

    接触Python以来,看到类里的函数要带个self参数,一直搞不懂啥麻子原因.晚上特别针对Python的self查了一下,理理. Python要self的理由 Python的类的方法和普通的函数有一个 ...

  2. python中的类怎么定义怎么用_python中怎么定义一个类

    什么是类? 类用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 什么是方法? 类中的函数即为方法 如何定义一个类? 定义类,语法格式如下:clas ...

  3. python两个装饰器执行顺序_python中多个装饰器的执行顺序详解

    装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...

  4. python装饰器的顺序_python中多个装饰器的执行顺序详解

    装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...

  5. python装饰器的顺序_python中装饰器的装饰顺序和执行顺序

    在python语言中"装饰器"模式被设计成语言内置的设计模式,使得使用该模式变得简单,仅仅需要在目标函数前使用'@'符号加装饰器名就能达到目的.但如果同一个目标函数需要进行多次装饰 ...

  6. python装饰器类型错误_Python各种类型装饰器?一起看看这份详解说明吧

    装饰器说明Python中的装饰器是一种可以装饰其它对象的工具. 该工具本质上是一个可调用的对象(callable),所以装饰器一般可以由函数.类来实现. 装饰器本身需要接受一个被装饰的对象作为参数,该 ...

  7. python装饰器与闭包_python闭包与装饰器

    本文针对: 学不会,学过即忘,学完跑路 的相关python人群. 一.Python闭包 定义: 访问了定义体以外的定义的非全局变量.(刚学时看不懂这句话太TM正常了) 定义解析: 其实就是函数里面再定 ...

  8. python中文件分类_Python中的类是否在不同的文件中?

    在Python中,一个文件称为 module.一个模块可以由多个类或函数组成. 由于Python不仅仅是一种OO语言,所以没有规则说明,一个文件只能包含一个类. 一个文件(模块)应该包含属于一起的类/ ...

  9. python中的类及self详解_Python类class参数self原理解析

    1.self只有在类的方法中才会有,其他函数或方法是不必带self的. 2.在调用时不必传入相应的参数. 3.在类的方法中(如__init__),第一参数永远是self,表示创建的类实例本身,而不是类 ...

  10. python中的类的属性是什么_python中类属性和数据属性的解释

    python中的类叫class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实例 ...

最新文章

  1. Linux终端实现自己的命令解释器----mybash
  2. html中事件处理中的this和event对象
  3. Insert intervals
  4. Chrome新的语言API,让您的浏览器说话
  5. WPF学习笔记(三)
  6. c#调用c++ delegate callback
  7. 为什么 jsp 还没有淘汰?
  8. spring RedisTemplate 缓存
  9. 关于springboot:Spring-ContentNegotiation内容协商之使用篇一
  10. java爬虫爬取豆瓣电影_小爬虫之爬取豆瓣电影排行榜
  11. 小白的理财之道:赚钱人生第一桶金
  12. org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hiber
  13. 学习笔记三:衍生兄弟——过冲和振铃
  14. C++ int a= {}和int a = 0
  15. Html随机数小程序
  16. 学习日志:第一篇博客
  17. 利用LSTM对脑电波信号进行分类
  18. 微生物组-宏基因组分析专题技术研讨会(2023.3)
  19. 给计算机老师的元旦祝福,2020给老师元旦祝福语
  20. python之selenium模拟登录QQ空间

热门文章

  1. OpenCV颜色空间——HLS颜色空间
  2. VirtualBox没有64位选项,无法安装64位的解决方法(zhuan)
  3. 学习使用TestNG中的注解(2)——@Factory的使用
  4. JAVASCRIPT实现XML分页
  5. 动态规划之01背包问题(含代码C)
  6. 机器学习第三回——logistic回归算法
  7. EXCEL 利用替换、分列、填充功能综合整理财务数据
  8. 【ArcGIS|空间分析】志愿者分配管理区域内共享单车(全国大学生GIS技能大赛试题)
  9. Vite Vue项目加载Cesium模块
  10. “AI+遥感”产品研究现状