Python 和装饰器能这样用吗?

2016-02-02 16:46:02 +08:00
 zanpen2000

先来看 Flask 框架的例子:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def show_helloworld():
    return "hello, world"

app.run()

接下来是问题:

我能不能类似 @app.route 的形式实现如下的定义

@menu('菜单名字', parent_menu='父菜单名字')
class menuItem(object):
    pass

能实现吗?如何实现?

python 的强大另人心生敬畏,请教各位高人,如何在不使用数据库的情况下,只读取源码实现菜单的动态生成

1682 次点击
所在节点    问与答
14 条回复
mhycy
2016-02-02 16:50:57 +08:00
问题问的是装饰器还是动态菜单生成?
如果是代码生成菜单,完全可以用字典来实现一个
如果问的是装饰器,这种调用形式记忆中是不可用,实际可以试试。
zanpen2000
2016-02-02 16:53:01 +08:00
@mhycy 怪我问的不清楚,我是想说,如何像 Flask 那样,发现被装饰对象,读取被装饰对象的信息,然后根据这些信息组合成菜单
zanpen2000
2016-02-02 16:55:53 +08:00
我承认问题问的有点轴,其实在装饰器内部就可以干这个事情,但是我想在第三方代码比如另外的模块里实现这个功能
aisk
2016-02-02 16:56:05 +08:00
aisk
2016-02-02 16:57:58 +08:00
Python2.6 之后 class 也能上 decorator
zanpen2000
2016-02-02 16:58:55 +08:00
@aisk 大概就是这个意思,但我想在其他模块中去发现,而不是在装饰器内实现
aisk
2016-02-02 17:03:59 +08:00
不太明白,其他模块指什么?
zanpen2000
2016-02-02 17:06:23 +08:00
@aisk 你看,装饰器方法只有在被装饰的方法被调用时才会运行,但是我想用另外一个.py 文件(模块)去发现这些被特定装饰器装饰的类或者方法,然后将已经发现的这些被装饰的类或者方法组织起来,形成一个菜单树
zanpen2000
2016-02-02 17:08:12 +08:00
@aisk 这样,可以说是主动发现吧,就是用一个方法去检查发现所有被特定装饰器装饰了的对象,然后做点事情
wenbinwu
2016-02-02 17:09:38 +08:00
zanpen2000
2016-02-02 17:14:10 +08:00
@wenbinwu 仔细拜读,请收下小白的膝盖
zanpen2000
2016-02-02 17:22:23 +08:00
看来还是看书看的少,一些 python 的特性在这段代码里都有运用,组合起来产生神奇的效果
aisk
2016-02-02 17:37:06 +08:00
这得祭出 ast 大杀器了:

https://gist.github.com/aisk/05f9a9e39383785e8da0

代码没有测试过,不过原理是这样,肯定能实现。
hahastudio
2016-02-02 17:39:10 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/255034

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX