python装饰器-python中的装饰器常用于哪些应用场景

最新回答

0a576d0b8af030a35061ad060254515f0e0e9edf.jpg

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

装饰器本身就是一个函数, 将所装饰的函数, 作为一个参数传进来, 然后在执行这个函数之前, 进行一个处理,这就是装饰器. 所以和正常函数执行顺序是一样的..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值