快速创建灵活的python装饰器
decorators的Python项目详细描述
问题
python有一些用于装饰的表单,您可以有一个简单的 decorator,没有参数:
@mydecoratordeffoo():pass
或者有一些参数的装饰符:
@mydecorator(1,2)deffoo():pass
你甚至可以装饰一个班级:
@mydecoratorclassFoo(object):pass
每个表单的实现都有点不同这真令人沮丧 如果您想创建易于使用的装饰器 不需要担心@mydecorator()的工作方式与 @mydecorator。
装饰器模块
decorators.Decorator类允许您轻松创建 包含所有窗体和所有类型(函数、方法, 类)使用相同的接口:
importdecoratorsclassmydecorator(decorators.Decorator):defdecorate_func(self,func,*dec_args,**dec_kwargs):defdecorator(*args,*kwargs):print"You passed into the decorator these arguments",dec_args,dec_kwargsprint"You passed into your function these arguments",args,kwargsprint"Your function is",funcreturnfunc(*args,**kwargs)returndecoratordefdecorate_class(self,klass,*dec_args,**dec_kwargs):print"You passed into the decorator these arguments",dec_args,dec_kwargsprint"Your class is",klassreturnklass
然后可以使用此装饰器:
@mydecoratordeffoo():print"foo()"@mydecorator(1,2,boom="blam")defbar(*args,**kwargs):print"bar()"@mydecoratorclassBaz(object):pass@mydecorator(1,2,boom="blam")classChe(object):pass
现在,您的装饰器可以装饰函数或类,传入 不管有没有争论,你都不必担心 装修师之间的区别,最重要的是,你不必 重复的代码。
其他装修工
如果您想创建一个 是完全灵活的,如果你想强制你的装饰者仅仅是 用于函数/方法,可以使用FuncDecorator。如果你愿意 若要仅修饰类,请使用ClassDecorator,如果要 修饰类的每个实例,使用InstanceDecorator。
无论使用哪个子类,都将decorate方法重写为 返回decorator函数:
importdecoratorsclassonly_func(FuncDecorator):defdecorate(self,func,*dec_a,**dec_kw):defdecorator(*args,**kwargs):returnfunc(*args,**kwargs)returndecorator# this will work@only_funcdeffoo():pass# this will fail@only_funcclassFoo(object):pass
安装
使用pip:
pip install decorators
或者,要从源代码中获取最新和最好的信息:
pip install git+https://github.com/firstopinion/decorators#egg=decorators