Python函数系列之装饰器(三)
admin
2023-07-06 12:25:16
0

在Python中,装饰器的本质就是Python中的一个函数,其来源自Python面向对象。装饰器是在函数调用之上的修饰。这些修饰仅是当声明一个函数或方法的时候,才会被应用额外的调用。有点类似Java中的AOP(面向方面编程)。同时在设计模式中,还有装饰器模式,也即是:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构原则是:不修改被修饰函数的源代码,不修改被修饰函数的调用方式。

装饰器的用途:

  • 引入日志

  • 增加计时逻辑来检测性能

  • 给函数加入事务的能力

  • 权限校验

  • 缓存

  • 执行函数前/后的预备或清理功能等

例子:

# -*- coding: utf-8 -*-

import time

def deco(func): #func = test1或test2
    def wrapper():
        start_time = time.time();
        func(); #就是运行 test1()或者test2()函数
        end_time = time.time();
        print("此模块运行时间为:%s" %(end_time - start_time));
    return wrapper;

def test1():
    time.sleep(3);
    print("函数Test1运行结束");


def test2():
    time.sleep(3);
    print("函数Test2运行结束")

#在没用使用装饰器调用时,如下调用
test1 = deco(test1) #返回的wrapper函数地址
test1() #执行的wrapper()

test2 = deco(test2)
test2()

#若上面函数有上百上千个,都是那样调用,都是重复的代码调用,在Python中,使用@语法糖

#例如下面定义一个test3函数
@deco  #就相等于 test3 = deco(test3)
def test3():
    time.sleep(3);
    print("函数Test-3运行结束");
test3()

运行结果如下:

函数Test1运行结束

此模块运行时间为:3.000406265258789

函数Test2运行结束

此模块运行时间为:3.000087261199951

函数Test-3运行结束

此模块运行时间为:3.000718355178833


Process finished with exit code 0

装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数。紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数。

例如如下:

@decorator(dec_opt_args)

def func(func_opt_args):

  ......


相关内容

热门资讯

我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...
原创 识... 还是那句话,机圈苦大屏久已…… 虽然大屏有大屏的美,但是小屏也有小屏的俏。在大屏旗舰占据主流的手机市...
玄戒技术取得分频电路专利,实现... 国家知识产权局信息显示,北京玄戒技术有限公司取得一项名为“分频电路、分频器、射频芯片和电子设备”的专...
为什么今年香会基调明显变了 5月29日—31日在新加坡举行的第23届香格里拉对话会(简称“香会”),见证着元首引领下大国关系继续...
成本几毛钱、假驱蚊液香精兑水,... 入夏升温,蚊虫进入活跃期,驱蚊防护成为民生刚需,《财经调查》持续接到消费者投诉,他们买到的多款网红驱...
越来越多80后90后,正在丧失... 六一儿童节到来之际,朋友圈里开始出现一种熟悉的热闹。有人晒出零食礼包,有人半开玩笑地向伴侣讨礼物,还...
洋保电子取得用于低温环境的电气... 国家知识产权局信息显示,洋保电子(太仓)有限公司取得一项名为“一种用于低温环境的电气柜”的专利,授权...
中日韩飞手争霸宁波!2026无... 潮新闻客户端 记者 陈冲 通讯员 朱凝 5月31日,2026小遛·无人机竞速世界杯(中国·宁波鄞州站...