V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zanpen2000
V2EX  ›  问与答

Python 和装饰器能这样用吗?

  •  1
     
  •   zanpen2000 · 2016-02-02 16:46:02 +08:00 · 1789 次点击
    这是一个创建于 3217 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先来看 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 的强大另人心生敬畏,请教各位高人,如何在不使用数据库的情况下,只读取源码实现菜单的动态生成

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

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

    代码没有测试过,不过原理是这样,肯定能实现。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:55 · PVG 22:55 · LAX 06:55 · JFK 09:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.