快速创建灵活的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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在使用apache poi获取空行中的getLastCellNum()方法时获取nullPointerException   向方法发送多个参数并返回值,Java   转换SVG时Batik出现java错误:<use>元素的属性“xlink:href”是必需的   使用迭代器时的java ConcurrentModificationException<Node>   java Maven正在向本地存储库安装一个不在依赖关系树或我的POM中的依赖关系   java如何检测设备是否有传感器使用Kotlin中的指南针?   如何选择在seleniumjava中运行时生成div[i]的复选框?   java使用Spring和html表单获取对象   传递特定格式字符串的java构造函数   解组错误时找不到java类。带字节数组的包裹,字节[]   在Java中,如何从超类方法中获取子类值?   java hibernate如何确保用数据库中的最新数据更新二级缓存   多线程在java中是Mac#doFinal()线程安全的吗?   java apache velocity:附带编译的模板   java禁用安卓 webview中的弹出窗口和警报框   为什么ANT不为构建使用Eclipse工作区默认JRE   java MySQL:ON DUPLICATE KEY语句在JDBC中失败   java Spring+AngularJs+Tomcat 9.0 403发送PUT请求时出错   Java服务器在需要时侦听socket