博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python动态装饰器
阅读量:6434 次
发布时间:2019-06-23

本文共 837 字,大约阅读时间需要 2 分钟。

python的装饰器是静态的,也就是说你使用的装饰器一定是定义好的对象。在某些特殊的情况下,需要让动态使用装饰器。

警告

不要随便用这个办法,一点都不优雅,能够使用其他的方法规避动态调用装饰器就不要这么写。

需求

装饰器是类的一个属性,初始化时传入一个特定的对象。某个类方法需要被这个特定实例装饰才能生效。

我的问题情景

类需要使用一个Flask实例初始化,类定义了一些列路由。这些路由需要被绑定在Flask实例上。

一个方法是使用add_url_rule()添加视图函数。但是这样做没添加一个视图函数就会多写一条add_url_rule(),并不是很优雅。比较优雅的方式是写一个dict,里面定义路由和视图函数,然后遍历dict完成添加。

思路

动态装饰器的问题无非是装饰器不能使用self访问类,那用嵌套函数不就可以访问了吗,就是丑了一点而已

class decorator_test:    def __init__(self):        self.test()        self.wrapped_func()    def wrapper(self, func):        def wrapped(*args, **kwargs):            print('wrapped')            return func(*args, **kwargs)        return wrapped    def test(self):        @self.wrapper        def wrapped_func():            print('wrapped_func')        self.__setattr__('wrapped_func', wrapped_func)复制代码

看看就好,别用

转载于:https://juejin.im/post/5cd4f37ff265da039a3d8b32

你可能感兴趣的文章
重新定义了左侧边栏
查看>>
《从零开始学Swift》学习笔记(Day4)——用Playground工具编写Swift
查看>>
“信息指纹”是什么
查看>>
ACT完善与修改测试
查看>>
ASP.NET下载诸如word,txt,图片等
查看>>
Git SSH Key 生成步骤
查看>>
HTML中加入搜索支持和文字编码
查看>>
MongoDB-基础-条件操作符
查看>>
AE中Shapefile文件添加到SDE数据集
查看>>
Linux输入子系统:多点触控协议 -- multi-touch-protocol.txt【转】
查看>>
C++实现委托机制(二)
查看>>
关于ASP.NET 将数据导出成Excel 的总结[上]
查看>>
web前端socket封装库--giraffe
查看>>
Splash Screen 加载窗体 [not finished]
查看>>
C# 操作线程的通用类[测试通过]
查看>>
查询重复记录
查看>>
Linux系统时间与RTC时间【转】
查看>>
解决Intel SSD 330i 240G在Windows 8启动慢的问题
查看>>
.Net开发笔记(五) 关于事件
查看>>
android:unable to instantiate activity componentinfo
查看>>