如果想在程序中加入恶意代码,装饰器是不错的选择!
- 一来装饰器函数一般在主程序外定义,不易被发现;
- 二来装饰器函数在主程序运行之前执行,可以在主程序运行之前,获得系统分配的资源.
# 匹配"字符名称网页"的函数
@route(r"[a-z]+\.html")
def char(file_name, url=None):
    print("收到了‘名称为字符‘的网页")
    print("接收的文件名为",file_name)
    print("匹配的正则url表达式为:",url)
    print("~"*20)
#匹配"数字名称网页"的函数
@route(r"[\d]+\.html")
def num(file_name, url=None):
    print("收到了‘名称为数字‘的网页")
    print("接收的文件名为",file_name)
    print("匹配的正则url表达式为:",url)
    print("~"*20)
# route用于匹配函数式
def route(url):
    # set_func用于接收函数的引用
    def set_func(func):
        # 将正则表达式与函数绑定
        route_dic[url] = func
        print("--为route_dic--添加了一个键值对")
        # call_func用于创建新的函数,并将新函数返回,替换被修饰的旧函数
        def call_func(file_name, url):
            return func(file_name, url)
        return call_func
    return set_func
基础的装饰器定义为两层函数嵌套,外层负责接受原函数(被添加装饰器的函数)的引用,内层负责扩展原函数功能,最后外层函数将内层函数返回,返回的内层函数将替代原函数(被添加装饰器的函数)
我们这里的装饰器函数在基础装饰器的层面上又多套了一层负责判定的函数,这样我们的装饰器就有了"分类功能"
import re
# 用于存储"函数的引用" 与 "url正则表达式"的键值对
route_dic = dict()
# route用于匹配函数式
def route(url):
    # set_func用于接收函数的引用
    def set_func(func):
        # 预加载,将正则表达式与函数绑定
        route_dic[url] = func
        print("--为route_dic--添加了一个键值对")
        # call_func用于创建新的函数,并将新函数返回,替换被修饰的旧函数
        def call_func(file_name, url):
            return func(file_name, url)
        return call_func
    return set_func
        
@route(r"[a-z]+\.html")
def char(file_name, url=None):
    print("收到了‘名称为字符‘的网页")
    print("接收的文件名为",file_name)
    print("匹配的正则url表达式为:",url)
    print("~"*20)
@route(r"[\d]+\.html")
def num(file_name, url=None):
    print("收到了‘名称为数字‘的网页")
    print("接收的文件名为",file_name)
    print("匹配的正则url表达式为:",url)
    print("~"*20)
def match_func(file_name):
    for url, call_func in route_dic.items():
        ret = re.match(url, file_name)
        if ret:
            print("找到了页面")
            call_func(file_name,url)
        else:
            pass
def main():
    print("route字典的值为", route_dic)
    # 测试"名称为字符"的网页
    match_func("index.html")
    # 测试"名称为数字"的网页
    match_func("123.html")
if __name__ == "__main__":
    main()
运行结果
如上图所示,
123.html和index.html都被分配到了对应的函数执行!
route_dic之前,未调用过route函数,但route_dic中却早已有了值,说明在main函数执行之前,route函数已经被调用过了;原文:http://www.cnblogs.com/QI1125/p/7518067.html