python3 装饰器

2019-10-14 09:06 来源:未知

要是想在程序中参加恶意代码,装饰器是没有错的挑选!

  • 一来装饰器函数平日在主程序外定义,不易被发觉;
  • 二来装饰器函数在主程序运营在此以前实行,能够在主程序运转在此以前,获得系统分配的财富.

装饰器的语法则则很有意思,可以在不变原有函数代码的前提下进行扩充,完成程序的大团结迭代进级

其实装饰器的作用不只是改造函数,假诺您愿意,装饰器仍是能够"智能"的选用函数

在网址的后台,有诸如此比一种供给:需求把前端页面包车型地铁伸手分类管理:把平日(1345.html, 4567.html)等以数字命名的网页逻辑交由三个函数管理;把日常(index.html, center.html)等以字母命名的网页交由另二个函数管理;

向来的讲,正是对两样页面包车型地铁恳求举办归类管理.

对数码进行分拣相配,正则表明式是首要推荐的形式!

作者们先定义八个担任管理差别逻辑的函数,并顺便"正则表明式"相配准则的装饰器

# 匹配"字符名称网页"的函数
@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()

运作结果

图片 1

运营结果

如上海教室所示,123.htmlindex.html都被分配到了相应的函数施行!


越来越深一点:

精心的人会发觉,其实装饰器函数比主程序要更早的试行

  • 证据1:主程序在使用字典route_dic事先,未调用过route函数,但route_dic中却早就有了值,表明在main函数试行以前,route函数已经被调用过了;
  • 凭据2:从以上程序的实行结果截图来看,增加键值对的操作在main函数推行此前,提前施行了两遍,正好对应四个装饰器

万一想在前后相继中投入恶意代码,装饰器函数是不错的精选!

  • 一来装饰器函数通常在主程序外定义,不易被发觉;
  • 二来装饰器函数在主程序运行在此之前施行,能够在主程序运维之前,获得系统一分配配的能源.

作者:_昭昭_
链接:
來源:简书
文章权归作者全部。商业转发请联系小编获得授权,非商业转发请注解出处。

TAG标签:
版权声明:本文由银河国际点击登录发布于升级网络游戏,转载请注明出处:python3 装饰器