python3 装饰器

2019-10-08 15:35 来源:未知

假若想在先后中投入恶意代码,装饰器是正确的挑选!

  • 一来装饰器函数平常在主程序外定义,不易被察觉;
  • 二来装饰器函数在主程序运维在此之前实行,能够在主程序运转在此之前,得到系统一分配配的资源.

装饰器的语准绳则很有趣,能够在不更换原有函数代码的前提下实行扩展,达成程序的温馨迭代晋级

实际上装饰器的效益不只是更动函数,若是您愿意,装饰器仍是能够"智能"的选拔函数

在网站的后台,有如此一种必要:要求把前端页面包车型大巴呼吁分类管理:把常常(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标签:
版权声明:本文由澳门国际银河备用网址发布于www.308877.com,转载请注明出处:python3 装饰器