浅析Python装饰器以及装饰器模式
漫谈
如果作为一个Python入门,不了解Python装饰器也没什么,但是如果作为一个中级Python开发人员,如果再不对python装饰器熟稔于心的话,那么可能并没有量变积累到质变。
我以前也看过很多讲python装饰器的文章,但是都是看了就忘。一方面是没有做太多的练习,二是对它的领会不是很深。
希望引以为戒!!!
郑传
装饰模式
如果你了解Java,你肯定听过装饰器模式。在面向对象中,装饰模式指:动态地给一个对象添加一些额外的职责。就增加一些功能来说,装饰模式比生成子类更为灵活。
在设计模式学习----装饰器模式,我摘取了下面一段使用装饰器模式的代码
publicclassDecoratorPattern{ /** *@paramargsthecommandlinearguments */ publicstaticvoidmain(String[]args){ //TODOcodeapplicationlogichere Basketbasket=newOriginal(); //一个装饰的过程 BasketmyBasket=newAppleDecorator(newBananaDecorator(newOrangeDecorator(basket))); myBasket.show(); } }
等会注意下BasketmyBasket=newAppleDecorator(newBananaDecorator(newOrangeDecorator(basket)))这段的写法
在Python官方文档PythonDecorators是这么介绍装饰器的
WhatisaDecorator
Adecoratoristhenameusedforasoftwaredesignpattern.Decoratorsdynamicallyalterthefunctionalityofafunction,method,orclasswithouthavingtodirectlyusesubclassesorchangethesourcecodeofthefunctionbeingdecorated.
翻一下:就是装饰器是一种软件设计模式,被用来动态修改函数、方法,或者类功能却不是通过子类,或者修改原代码实现。
跟之前是一个意思!!!
PythonDecorator
而Python的装饰器与之不同,官方这么说:
The"decorators"wetalkaboutwithconcerntoPythonarenotexactlythesamethingastheDecoratorPatterndescribedabove.APythondecoratorisaspecificchangetothePythonsyntaxthatallowsustomoreconvenientlyalterfunctionsandmethods(andpossiblyclassesinafutureversion).ThissupportsmorereadableapplicationsoftheDecoratorPatternbutalsootherusesaswell.
SupportforthedecoratorsyntaxwasproposedforPythoninPEP318,andwillbeimplementedinPython2.4.
翻译下:Python的decorators与DecoratorPattern并不完全相同。Python的decorator是一种特殊:在语法上实现允许我们更灵活地更改方法,或者函数。
例子:
@classmethod deffoo(arg1,arg2): ....
记住这个特殊的语法,后面我们会展示这个强大的语法糖