python中的装饰器decorator

本文深入探讨了Python装饰器的语法与应用,包括无参装饰器和有参装饰器的实现方式。同时,文章还介绍了面向对象设计中的装饰模式,对比了装饰模式与继承的优缺点,并列举了多种适用场景。

装饰器的语法以@开头,接着是装饰器要装饰的函数的申明等。

其实总体说起来,装饰器其实也就是一个函数,一个用来包装函数的函数,装饰器在函数申明完成的时候被调用,调用之后申明的函数被换成一个被装饰器装饰过后的函数。

装饰器分为无参装饰和有参装饰

def deco(func):
    def replaceFunc():     #定义一个内嵌函数,此函数包装了被装饰的函数,并提供额外操作的代码
        print "Enter decorator"     #进行额外操作
        return func()    #产生对被装饰函数的调用
    return replaceFunc   #由于返回的是这个新的内嵌函数,所以确保额外操作每次调用得以运行

@deco
def MyFunc():   #应用@deco修饰的方法
    print "Enter MyFunc"

MyFunc()     #调用被装饰的函数

输出结果:
 Enter decorator
 Enter MyFunc

 
效果等同于: deco(MyFunc)  见replaceFunc-->先print然后调用被装饰函数.

每个decorator只是一个方法, 可以是自定义的或者内置的(如内置的@staticmethod/@classmethod)。decorator方法把要装饰的方法作为输入参数,在函数体内可以进行任意的操作(可以想象其中蕴含的威力强大,会有很多应用场景),只要确保最后返回一个可执行的函数即可(可以是原来的输入参数函数,或者是一个新函数)。


decorator对于剥离验证和错误处理等常用逻辑很有用处,  类似于c/c++中用宏来定义一些结构上类似的函数.


设计模式之Decorator:
 意图
   动态地给一个对象添加一些额外的职责(动态包装)。就增加功能来说,Decorator模式相比生成子类更为灵活。
 在以下情况下应当使用装饰模式:
  需要扩展一个类的功能,或给一个类增加附加责任。
  需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
  需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。

使用装饰模式主要有以下的优点:

装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错。
Decorator模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。同时它很好地符合面向对象设计原则中“优先使用对象组合而非继承”和“开放-封闭”原则。

 

使用装饰模式主要有以下的缺点:

由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。

 

继承带来的可能问题:
一来继承的层次可能会很多,二来子类的数量可能会很多。

 

Ref link:
http://lijiong-say.spaces.live.com/Blog/cns!D9877CF89E4689B1!129.entry
http://blog.youkuaiyun.com/suiyunonghen/archive/2009/03/06/3962885.aspx
[GAE自动管理memcache的装饰器]http://www.119797.com/program/gae-memcache/
[如何利用Python的decorator彻底的分离软件中的横切面]http://www.yuntien.com/forum/post/10835/
[无废话C#设计模式之十三:Decorator]http://dev.yesky.com/173/7686173.shtml
http://terrylee.cnblogs.com/archive/2006/03/01/340592.html
http://www.cnblogs.com/zhenyulu/articles/46735.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值